Added comprehensive plugin system for independent JavaScript UI development: **Plugin Infrastructure:** - Extended existing MarkiTect plugin system with RenderingEnginePlugin base class - Added RENDERING plugin type to PluginType enum - Created RenderingConfig for asset management and deployment - Implemented RenderingEngineManager for plugin discovery and lifecycle **TestDrive JSUI Plugin:** - Extracted JavaScript UI components to independent testdrive-jsui plugin - Created standalone development environment (no Python required) - Implemented compass-positioned control panels (NW, NE, E, SE) - Added clean JSON configuration interface for Python↔JavaScript data transfer **Asset Management:** - Development mode: serve assets directly from plugin source directory - Production mode: deploy to _markitect/plugins/[plugin-name]/ structure - Configurable asset URLs and deployment strategies - Support for external dependencies (CDN resources) **Standalone Development:** - testdrive-jsui/test.html for browser-based development - Package.json with npm scripts for development server - Complete separation of JavaScript development from Python environment - Hot reload and standard web development workflow **Integration Demo:** - demo_plugin_integration.py showcasing all plugin capabilities - Standalone, plugin discovery, production deployment examples - Asset URL generation for different deployment modes This enables JavaScript-first development while maintaining clean integration with the MarkiTect Python ecosystem. Developers can now work on UI components independently using standard web development tools and workflows. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
122 lines
3.6 KiB
HTML
122 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="generator" content="TestDrive JSUI {version}">
|
|
<title>{title}</title>
|
|
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif;
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
padding: 2rem;
|
|
line-height: 1.6;
|
|
color: #333333;
|
|
background-color: #ffffff;
|
|
}
|
|
#markdown-content {
|
|
min-height: 200px;
|
|
}
|
|
h1, h2, h3, h4, h5, h6 {
|
|
color: #333333;
|
|
}
|
|
pre {
|
|
background-color: #f6f8fa;
|
|
color: #333333;
|
|
padding: 1rem;
|
|
border-radius: 6px;
|
|
overflow-x: auto;
|
|
border: 1px solid #d0d7de;
|
|
}
|
|
code {
|
|
background-color: #f6f8fa;
|
|
color: #333333;
|
|
padding: 0.2em 0.4em;
|
|
border-radius: 3px;
|
|
font-size: 0.9em;
|
|
}
|
|
pre code {
|
|
background: none;
|
|
padding: 0;
|
|
}
|
|
blockquote {
|
|
border-left: 4px solid #dfe2e5;
|
|
margin: 0;
|
|
padding-left: 1rem;
|
|
color: #6a737d;
|
|
}
|
|
table {
|
|
font-size: 0.85em;
|
|
border-collapse: collapse;
|
|
margin: 1rem 0;
|
|
width: 100%;
|
|
border: 1px solid #d0d7de;
|
|
}
|
|
th, td {
|
|
font-size: inherit;
|
|
border: 1px solid #d0d7de;
|
|
padding: 0.5rem;
|
|
text-align: left;
|
|
}
|
|
th {
|
|
background-color: #f6f8fa;
|
|
font-weight: 600;
|
|
}
|
|
img {
|
|
max-width: 12cm;
|
|
max-height: 20cm;
|
|
height: auto;
|
|
display: block;
|
|
margin: 1rem auto;
|
|
}
|
|
</style>
|
|
|
|
<!-- Plugin-specific CSS -->
|
|
{css_content}
|
|
|
|
<!-- External dependencies -->
|
|
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"
|
|
onload="window.markitectMarkedLoaded = true"
|
|
onerror="console.error('CDN library failed to load - network or firewall blocking marked.js'); window.markitectMarkedError = true;"></script>
|
|
</head>
|
|
<body class="{mode_class}">
|
|
|
|
<!-- Content container with fallback content -->
|
|
<div id="markdown-content">
|
|
{fallback_content}
|
|
</div>
|
|
|
|
<!-- Configuration Data Interface - Clean JSON configuration -->
|
|
<script id="markitect-config" type="application/json">{config_json}</script>
|
|
|
|
<!-- Plugin JavaScript Assets -->
|
|
{js_scripts}
|
|
|
|
<!-- Initialization Script -->
|
|
<script>
|
|
window.addEventListener('load', function() {
|
|
console.log('🎯 TestDrive JSUI loading complete, initializing...');
|
|
|
|
// Handle CDN loading errors
|
|
if (window.markitectMarkedError) {
|
|
console.error("CDN library failed to load - network or firewall blocking marked.js");
|
|
}
|
|
|
|
// Initialize main application
|
|
try {
|
|
if (typeof MarkitectMain !== 'undefined') {
|
|
console.log('🚀 Starting MarkitectMain initialization...');
|
|
MarkitectMain.initialize();
|
|
} else {
|
|
console.warn('⚠️ MarkitectMain not available, edit functionality may be limited');
|
|
}
|
|
} catch (error) {
|
|
console.error('❌ TestDrive JSUI initialization failed:', error);
|
|
console.log('📄 Content should still be visible in fallback mode');
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |