feat: consolidate testdrive-jsui to capabilities and implement plugin self-declaration

## Major Changes
- Moved all testdrive-jsui assets from root to capabilities/testdrive-jsui/
- Consolidated directory structure: js/, static/css/, static/images/, static/templates/
- Implemented plugin self-declaration (get_plugin_source_dir, get_asset_paths)
- Removed hardcoded plugin discovery from rendering.py
- Updated all asset paths to be relative to capability root

## Architecture Improvements
- Single source of truth for all testdrive-jsui assets
- Plugin declares its own location (no hardcoded paths)
- Generic plugin discovery using hasattr check
- Clean separation: all JS in .js files, no code mixing
- Standalone capability ready for independent use

## Files Changed
- markitect/plugins/testdrive_jsui.py: Added self-declaration methods
- markitect/plugins/rendering.py: Removed hardcoded discovery
- capabilities/testdrive-jsui/README.md: Added standalone usage documentation
- Moved 17 asset files to consolidated structure
- Deleted obsolete /testdrive-jsui/ root directory

## Testing
- All 17 assets verified and working
- Tested via CLI: markitect md-render --engine testdrive-jsui
- Full document rendering successful

Prepares testdrive-jsui to become a git submodule with proper dependency management.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-15 23:42:54 +01:00
parent d0a1c91b8e
commit ab3f0db86f
41 changed files with 223 additions and 6073 deletions

View File

@@ -0,0 +1,129 @@
/**
* 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;
}
/* Removed debug-header styles - using base class title formatting */
.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;
}
}

View 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; }

View 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);
}