Compare commits
40 Commits
v0.4.0
...
ea307a7e00
| Author | SHA1 | Date | |
|---|---|---|---|
| ea307a7e00 | |||
| 4f41b22335 | |||
| 14ea058e7f | |||
| ea632a2624 | |||
| 4fa02cba52 | |||
| 91291d727e | |||
| d65df8c2a4 | |||
| 38cd18c96e | |||
| 3a353b4d4f | |||
| ed33766c91 | |||
| 9f4e296dd3 | |||
| c7a83070f8 | |||
| dd3a00040a | |||
| be14322b13 | |||
| 86689c451c | |||
| 3e16793615 | |||
| dd0c9e3180 | |||
| 6dd278c538 | |||
| c6422bf73e | |||
| 53cfb90237 | |||
| 388320b9bf | |||
| bbceea5c7b | |||
| 5df78c3359 | |||
| e78ad47754 | |||
| 45694a5099 | |||
| c0bfc1553c | |||
| 3e651adcfb | |||
| d0abaab63a | |||
| ff6b807f3b | |||
| 6447c617fd | |||
| 5337b26d5e | |||
| 87e970bbee | |||
| eced5cbae4 | |||
| 6e60e5f13d | |||
| 93655512d0 | |||
| 74ee2760e2 | |||
| aefece1fe7 | |||
| ce7ce0470f | |||
| 6df6430b72 | |||
| ed27dee5a0 |
1
.claude/agents/agent-claude-documentation.md
Symbolic link
1
.claude/agents/agent-claude-documentation.md
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/worsch/markitect_project/agents/agent-claude-documentation.md
|
||||
1
.claude/agents/agent-keepaChangelog.md
Symbolic link
1
.claude/agents/agent-keepaChangelog.md
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/worsch/markitect_project/agents/agent-keepaChangelog.md
|
||||
158
.claude/agents/agent-project-management.md
Normal file
158
.claude/agents/agent-project-management.md
Normal file
@@ -0,0 +1,158 @@
|
||||
---
|
||||
name: project-assistant
|
||||
description: Specialized assistant for project status, progress tracking, and development planning
|
||||
---
|
||||
|
||||
## Instructions
|
||||
|
||||
You are the MarkiTect project assistant, specialized in providing project status overviews, tracking progress, and helping determine next steps for development work.
|
||||
|
||||
### Core Responsibilities
|
||||
|
||||
1. **Project Status Overview**: Provide concise summaries of current project state by analyzing key project files
|
||||
2. **Progress Tracking**: Help understand what has been accomplished recently and what's currently in progress
|
||||
3. **Next Steps Planning**: Suggest logical next actions based on project status and documented plans
|
||||
|
||||
### Key Project Files & Their Purpose
|
||||
|
||||
- **ProjectStatusDigest.md**: The canonical source of truth for project architecture, features, and current state
|
||||
- **ProjectDiary.md**: Chronological record of major work packages, milestones, and development sessions
|
||||
- **NEXT.md**: Next steps and priorities to ease transfer between coding sessions
|
||||
- **Makefile**: Provides helpers to use and improve the capabilities provided by the project
|
||||
**Gitea Issues**: Backlog of issues and backlog of tasks stored as issues in gitea
|
||||
|
||||
### Project Infrastructure Knowledge
|
||||
|
||||
**Repository Structure:**
|
||||
- Main project hosted on Gitea with issue tracking for use cases and tasks
|
||||
- Documentation maintained in `wiki/` submodule
|
||||
- Test-drive dev workflow with tests in `tests/` handled by tddai-assistent subagent
|
||||
|
||||
**Development Workflow:**
|
||||
- Issue-driven development using Gitea API integration
|
||||
- TDD8 methodology via tddai-assistant subagent for comprehensive test-driven development
|
||||
- All commits require green test state
|
||||
|
||||
**Issue Management Protocol:**
|
||||
- **Gitea-First**: Feature requests, bugs, and enhancements should be documented as Gitea issues
|
||||
- **Issue Creation**: When new requirements emerge, create issues in Gitea immediately but do NOT implement immediately
|
||||
- **Strategic Planning**: Issues should be prioritized and scheduled based on project roadmap (history/ROADMAP.md)
|
||||
- **Implementation Discipline**: Only work on issues that are explicitly planned for the current session
|
||||
- **Issue Workflow**: Create → Triage → Plan → Schedule → Implement → Close
|
||||
|
||||
**TDD Workflow Management:**
|
||||
- For all TDD-related guidance, workflow management, and test-driven development questions, use the **tddai-assistant** subagent
|
||||
- The tddai-assistant specializes in the TDD8 methodology (ISSUE-TEST-RED-GREEN-REFACTOR-DOCUMENT-REFINE-PUBLISH cycle)
|
||||
- This includes sidequest management, test planning, and comprehensive development workflow guidance
|
||||
|
||||
### Response Guidelines
|
||||
|
||||
When asked about project status or next steps:
|
||||
|
||||
1. **Start with Current State**: Always check ProjectStatusDigest.md for the latest architecture and status
|
||||
2. **Review Recent Progress**: Check ProjectDiary.md for recent accomplishments and context
|
||||
3. **Check Planned Work**: Read Next.md for documented next steps and priorities
|
||||
4. **Consider Git Status**: Be aware of current working directory state and recent commits
|
||||
|
||||
### Issue Management Guidelines
|
||||
|
||||
**When to Create Gitea Issues:**
|
||||
- New feature requests or enhancement ideas emerge during development
|
||||
- Bugs or technical debt are discovered but not immediately fixable
|
||||
- Future improvements are identified but outside current session scope
|
||||
- Architecture decisions require documentation and future review
|
||||
- Sidequests that we want to remember for later implementation
|
||||
|
||||
**Issue Creation Protocol:**
|
||||
- Use descriptive titles that clearly state the requirement
|
||||
- Include context: why is this needed, what problem does it solve
|
||||
- Add relevant labels: enhancement, bug, documentation, technical-debt
|
||||
- Reference related issues or components affected
|
||||
- Do NOT implement immediately - issues are for tracking and planning
|
||||
|
||||
**Issue vs. Immediate Work:**
|
||||
- Current session planned work: implement directly (from Next.md)
|
||||
- Discovered improvements: create issue, continue with planned work
|
||||
- Critical bugs affecting current work: fix immediately, then create issue for root cause analysis
|
||||
- Future enhancements: always create issue first for proper planning
|
||||
|
||||
**Response Format:**
|
||||
- Provide a brief status summary (2-3 sentences)
|
||||
- Highlight recent progress or changes
|
||||
- Suggest 1-3 concrete next actions based on documented plans
|
||||
- Reference specific files and line numbers when relevant (e.g., `Next.md:8-12`)
|
||||
|
||||
### Example Response Structure
|
||||
|
||||
```
|
||||
## Current Status
|
||||
[Brief summary from ProjectStatusDigest.md]
|
||||
|
||||
## Recent Progress
|
||||
[Key accomplishments from ProjectDiary.md latest entries]
|
||||
|
||||
## Recommended Next Steps
|
||||
1. [Action from Next.md or logical progression]
|
||||
2. [Secondary priority or alternative approach]
|
||||
3. [Maintenance or validation task if applicable]
|
||||
|
||||
Based on: ProjectStatusDigest.md:74-79, Next.md:7-13
|
||||
```
|
||||
|
||||
## Session Start-Up Protocol
|
||||
|
||||
When asked what's up for a new coding session, follow this standardized routine:
|
||||
|
||||
### Start-of-Session Checklist
|
||||
1. **Mission Status**: Provide reminder to project vision and how we are doing
|
||||
2. **Recently**: Provide reminder what we did last from the last entry to the diary
|
||||
3. **NEXT.txt**: Check if we provided guidance for what to do next at the end of the last coding session
|
||||
4. **git status**: Check if git is clean or work has been left unfinished
|
||||
5. **Workspace clean**: Check if workspace is clean or we left of in the middle of a TDD cycle
|
||||
6. **Issue finished**: Check if we are currently working on a specific issue or need to select the next one
|
||||
7. **Suggestion**: Provide a sensible suggestion of what to do next
|
||||
|
||||
## Session Wrap-Up Protocol
|
||||
|
||||
When asked to help wrap up a development session, follow this standardized routine:
|
||||
|
||||
### End-of-Session Checklist:
|
||||
1. **Update ProjectDiary.md**: Add entry documenting progress, challenges, and achievements
|
||||
2. **Update NEXT.md**: Set clear priorities and strategy for next session
|
||||
3. **Update ProjectStatusDigest.md**: Refresh current status, metrics, and completed features
|
||||
4. **Issue Management**: Review and create any issues for sidequests and discoveries made during session
|
||||
5. **Anchor patterns**: Update this project-assistant definition with any new workflow patterns
|
||||
6. **Prepare for commit**: Ensure all documentation reflects current state
|
||||
|
||||
### Session Success Indicators:
|
||||
- All tests passing (green state)
|
||||
- Clear next steps documented
|
||||
- Technical debt addressed or documented
|
||||
- Progress measurably advanced toward project goals
|
||||
|
||||
### Wrap-Up Response Format:
|
||||
```
|
||||
## Session Summary
|
||||
[Brief overview of accomplishments and current state]
|
||||
|
||||
## Documentation Updates
|
||||
- ✅ ProjectDiary.md: [what was added]
|
||||
- ✅ Next.md: [priorities set]
|
||||
- ✅ ProjectStatusDigest.md: [status updated]
|
||||
|
||||
## Issues Created/Updated
|
||||
- 🎯 Issue #X: [brief description] - [reason for creation]
|
||||
- 📝 Issue #Y: [brief description] - [future enhancement]
|
||||
|
||||
## Next Session Preparation
|
||||
[Clear guidance for resuming work next time]
|
||||
|
||||
Ready for commit: [list of files to commit]
|
||||
```
|
||||
|
||||
### Example Issue Creation During Development:
|
||||
**Scenario**: While implementing CLI commands, discover that error messages could be improved
|
||||
**Action**: Create issue "Enhance CLI error messages with user-friendly formatting and suggestions"
|
||||
**Result**: Continue with current CLI implementation, address error enhancement in future session
|
||||
|
||||
Remember: Your role is to help developers quickly understand "where we are" and "what should we do next" when picking up work on the MarkiTect project, and to ensure proper session wrap-up for continuity.
|
||||
21
.claude/agents/test-agent.md
Normal file
21
.claude/agents/test-agent.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: test-agent
|
||||
description: Simple test agent to verify Claude Code agent functionality
|
||||
model: inherit
|
||||
---
|
||||
|
||||
## Instructions
|
||||
|
||||
You are a test agent to verify that custom agents work in Claude Code. When invoked, simply respond with "Test agent is working!" and confirm that you can see this instruction.
|
||||
|
||||
### Core Responsibilities
|
||||
|
||||
1. Respond to test requests
|
||||
2. Confirm agent system is functioning
|
||||
|
||||
### Authority and Scope
|
||||
|
||||
You can:
|
||||
- Confirm agent functionality
|
||||
- Provide test responses
|
||||
- Verify system integration
|
||||
117
CHANGELOG.md
117
CHANGELOG.md
@@ -1,4 +1,72 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.6.0] - 2025-10-28
|
||||
|
||||
### Added
|
||||
- **Custom Status Modal System**: Professional theme-consistent status dialogs replacing browser alerts with proper branding and accessibility
|
||||
- **HTML Generation Dogtag**: Automatic attribution with timestamp and username linking for generated HTML documents
|
||||
- **Enhanced Link Navigation**: All document links now open in new tabs without triggering edit mode for improved user experience
|
||||
- **Comprehensive UI Framework Documentation**: Complete guide (UserInterfaceFramework.md) for consistent UI development patterns
|
||||
- **Database Integration**: Added store_document method to CleanDocumentManager with proper front matter parsing
|
||||
- **Enhanced AST Processing**: Improved title extraction from front matter and heading detection with cache file generation
|
||||
|
||||
### Changed
|
||||
- **Complete Document Manager Cleanup**: Removed 2000+ lines of legacy code while maintaining full backward compatibility
|
||||
- **Clean Architecture Implementation**: DocumentManager now extends CleanDocumentManager with clean wrapper pattern
|
||||
- **Improved Error Handling**: Enhanced validation and graceful error recovery throughout the system
|
||||
- **Standardized CSS Naming**: Consistent class naming conventions across all UI components
|
||||
|
||||
### Fixed
|
||||
- **Test Suite Compatibility**: Updated all tests to work with clean implementation architecture
|
||||
- **JavaScript Syntax Issues**: Resolved template literal and string escaping problems in generated HTML
|
||||
- **Link Behavior**: Fixed issue where document links were incorrectly triggering edit mode
|
||||
- **Front Matter Parsing**: Proper integration with FrontMatterParser for metadata extraction
|
||||
|
||||
### Technical
|
||||
- Added --nodogtag CLI option for clean output when attribution is not desired
|
||||
- Enhanced ingest_file method with proper title extraction from front matter and headings
|
||||
- Implemented theme-aware modal overlay patterns with proper CSS styling
|
||||
- Fixed CSS escape sequences and JavaScript syntax validation issues
|
||||
|
||||
## [0.5.0] - 2025-10-26
|
||||
|
||||
### Added
|
||||
- **Clean TDD-Driven Editor Architecture**: Complete rewrite with object-oriented JavaScript architecture featuring Section, SectionManager, and DOMRenderer classes
|
||||
- **Enhanced Test Framework**: Comprehensive testing framework with clean separation of concerns for robust development
|
||||
- **Multiple Concurrent Section Editing**: Support for editing multiple sections simultaneously with intelligent management
|
||||
- **Intelligent Section Splitting**: Advanced heading detection and section management capabilities
|
||||
- **Four-Layer Content Management**: Sophisticated content state management (original, current, pending, editing layers)
|
||||
- **Enhanced Status Dialog**: Repository info display showing version, git commit status, and actual save filename
|
||||
- **Elegant Slide-in Control Panel**: Floating control panel for edit mode with improved UX
|
||||
- **Intelligent Auto-sizing Textarea**: Optimal editing experience with smart textarea resizing
|
||||
- **Enhanced Empty Line Preservation**: Better markdown structure preservation with automatic paragraph separation
|
||||
|
||||
### Fixed
|
||||
- **Textarea Sizing and Font Preservation**: Resolved sizing issues and maintained consistent font rendering
|
||||
- **Markdown Structure Preservation**: Fixed roundtrip formatting issues in save functionality
|
||||
- **Section Duplication Prevention**: Eliminated duplicate sections when saving edited content
|
||||
- **Section Position Preservation**: Prevented unwanted section jumping during editing
|
||||
- **CSS Embedding Issues**: Resolved import errors in HTML template generation
|
||||
- **Control Panel UX**: Hidden control ribbon when panel is expanded for cleaner interface
|
||||
|
||||
### Changed
|
||||
- **Action Semantics**: Proper implementation of Accept, Cancel, and Reset operations
|
||||
- **Global Reset Functionality**: Enhanced reset capabilities across the editor
|
||||
- **Makefile Organization**: Reorganized installation targets for better user experience
|
||||
|
||||
### Technical Improvements
|
||||
- Complete legacy editor system replacement
|
||||
- Test-driven development approach implementation
|
||||
- Enhanced UI/UX with better section positioning
|
||||
- Improved content management workflow
|
||||
|
||||
## [0.4.0] - 2025-10-25
|
||||
|
||||
### Added
|
||||
@@ -12,7 +80,54 @@
|
||||
### Other
|
||||
- chore: clean up repository documentation files for release
|
||||
|
||||
## [0.3.0] - 2025-10-25
|
||||
|
||||
### Added
|
||||
- **Kaizen-agentic Framework Integration**: Integrated capability submodule for enhanced development workflow
|
||||
- **Test Reorganization System**: Reorganized tests by capability with improved modularity
|
||||
- **Capability Inclusion Management**: Comprehensive system for managing capability inclusions
|
||||
- **Todofile System**: Implemented todofile system to replace NEXT.md for better task tracking
|
||||
|
||||
All notable changes to MarkiTect will be documented in this file.
|
||||
### Changed
|
||||
- **Directory Organization**: Logical separation and reorganization of project structure
|
||||
- **Historical File Organization**: Cleaner structure with better file organization
|
||||
|
||||
## [0.2.0] - 2025-10-20
|
||||
|
||||
### Added
|
||||
- **GraphQL Interface**: Advanced querying capabilities with full GraphQL implementation
|
||||
- **Full-text Search**: FTS5 backend integration for powerful search functionality
|
||||
- **Plugin Architecture**: Extensible framework with comprehensive plugin support
|
||||
- **Query Paradigms**: 14 different query paradigms for flexible data access
|
||||
- **Cost Management**: Activity tracking and resource cost management
|
||||
- **Template Rendering**: Template system with validation capabilities
|
||||
- **CLI Consolidation**: Unified command-line interface
|
||||
- **Production Asset Management**: Content-addressable storage system
|
||||
- **17 Kaizen-agentic Agents**: Integrated development agent ecosystem
|
||||
|
||||
### Changed
|
||||
- **Performance Optimization**: 60-85% performance improvement through system optimization
|
||||
- **Error Handling**: Enterprise-grade error handling and recovery mechanisms
|
||||
- **Resource Management**: Memory-efficient and scalable architecture
|
||||
|
||||
### Fixed
|
||||
- **Cross-platform Validation**: Comprehensive validation for Unix/Windows/macOS
|
||||
- **Type Safety**: Enhanced type safety and security validation
|
||||
- **Test Coverage**: 1983/1983 tests passing (100% success rate)
|
||||
|
||||
## [0.1.0] - 2025-10-15
|
||||
|
||||
### Added
|
||||
- **Development Infrastructure**: Comprehensive Makefile for development workflow
|
||||
- **Project Documentation**: ProjectStatusDigest.md and ProjectDiary.md for tracking
|
||||
- **TDD Workspace System**: Structured Test-Driven Development workflow implementation
|
||||
- **Issue Management**: Gitea integration for issue tracking and management
|
||||
- **Virtual Environment Management**: Enhanced venv detection and shell activation
|
||||
- **Wiki Integration**: Submodule tracking for project documentation
|
||||
- **Core Repository Setup**: Initial project structure and configuration
|
||||
|
||||
### Changed
|
||||
- **Build System**: Enhanced build targets with venv Python and PYTHONPATH support
|
||||
- **Target Naming**: Renamed workspace targets to TDD Workspace with tdd- prefix
|
||||
|
||||
xxx
|
||||
|
||||
205
LOST_FUNCTIONALITY_ANALYSIS.md
Normal file
205
LOST_FUNCTIONALITY_ANALYSIS.md
Normal file
@@ -0,0 +1,205 @@
|
||||
# Lost JavaScript Functionality Analysis
|
||||
|
||||
## 🔍 **Comprehensive Comparison: Old vs Current Implementation**
|
||||
|
||||
Based on analysis of git commit `ff6b807` (version 0.3.0) vs current implementation, here are the missing features:
|
||||
|
||||
---
|
||||
|
||||
## ❌ **MAJOR MISSING FEATURES**
|
||||
|
||||
### 1. **Advanced State Management**
|
||||
**Lost:**
|
||||
- `EditState` enum with 4 states: ORIGINAL, EDITING, MODIFIED, SAVED
|
||||
- `pendingMarkdown` property for unsaved changes
|
||||
- `stopEditing()` method that preserves changes as pending
|
||||
- Comprehensive state transitions and validation
|
||||
|
||||
**Current:** Basic boolean editing state only
|
||||
|
||||
### 2. **Section Splitting Functionality**
|
||||
**Lost:**
|
||||
- `checkForSectionSplits()` - automatic detection of new headings in content
|
||||
- `handleSectionSplit()` - splits sections when new headings are added
|
||||
- `splitSection()` method for creating multiple sections from one
|
||||
- Dynamic section reorganization during editing
|
||||
|
||||
**Current:** Sections remain static, no dynamic splitting
|
||||
|
||||
### 3. **Enhanced Keyboard Shortcuts**
|
||||
**Lost:**
|
||||
```javascript
|
||||
handleKeydown(event) {
|
||||
if (event.ctrlKey || event.metaKey) {
|
||||
switch (event.key) {
|
||||
case 'Enter': // Ctrl+Enter to accept changes
|
||||
case 'Escape': // Ctrl+Escape to cancel
|
||||
}
|
||||
}
|
||||
if (event.key === 'Escape') // Simple escape to cancel
|
||||
}
|
||||
```
|
||||
|
||||
**Current:** No keyboard shortcuts implemented
|
||||
|
||||
### 4. **Sophisticated Global Control Panel**
|
||||
**Lost:**
|
||||
- Floating control panel with status updates
|
||||
- `updateGlobalStatus()` - real-time status tracking every 2 seconds
|
||||
- `statusInterval` - periodic status updates
|
||||
- Visual status indicators (Ready, Modified, etc.)
|
||||
- Professional styling with CSS classes
|
||||
|
||||
**Current:** Basic controls without status tracking
|
||||
|
||||
### 5. **Intelligent File Naming System**
|
||||
**Lost:**
|
||||
```javascript
|
||||
generateSaveFilename() {
|
||||
// Method 1: Original filename from config
|
||||
// Method 2: Page title extraction
|
||||
// Method 3: URL pathname analysis
|
||||
// Method 4: First heading extraction
|
||||
// Timestamp generation
|
||||
}
|
||||
```
|
||||
|
||||
**Current:** Simple static filename
|
||||
|
||||
### 6. **Advanced Section Management**
|
||||
**Lost:**
|
||||
- `getAllSections()` method
|
||||
- Multiple concurrent editing sessions (`editingSections` Set)
|
||||
- Section type detection (`detectType()` static method)
|
||||
- Comprehensive section status reporting
|
||||
|
||||
**Current:** Basic section collection only
|
||||
|
||||
### 7. **Enhanced DOM Event System**
|
||||
**Lost:**
|
||||
- Rich event system with multiple event types:
|
||||
- `section-split`
|
||||
- `section-reset`
|
||||
- `changes-accepted`
|
||||
- `changes-cancelled`
|
||||
- `edit-started`
|
||||
- `edit-stopped`
|
||||
- Event-driven architecture with listeners
|
||||
|
||||
**Current:** Limited event handling
|
||||
|
||||
### 8. **Professional Message System**
|
||||
**Lost:**
|
||||
```javascript
|
||||
showMessage(message, type = 'info') {
|
||||
// Fixed positioning
|
||||
// Color-coded by type (success, error, info)
|
||||
// Auto-positioning and styling
|
||||
}
|
||||
```
|
||||
|
||||
**Current:** Basic alerts only
|
||||
|
||||
### 9. **Comprehensive Status Reporting**
|
||||
**Lost:**
|
||||
```javascript
|
||||
showStatus() {
|
||||
// Version info display
|
||||
// Save filename preview
|
||||
// Section statistics
|
||||
// Editing controls documentation
|
||||
// Section behavior explanation
|
||||
}
|
||||
```
|
||||
|
||||
**Current:** Basic modal without detailed info
|
||||
|
||||
---
|
||||
|
||||
## 🔧 **MISSING UTILITY FUNCTIONS**
|
||||
|
||||
### 1. **Section Utilities**
|
||||
- `Section.generateId()` - sophisticated hash-based ID generation
|
||||
- `Section.detectType()` - automatic section type detection
|
||||
- `hasChanges()` - change detection
|
||||
- `getStatus()` - comprehensive status object
|
||||
|
||||
### 2. **Content Processing**
|
||||
- Multi-line splitting logic for section creation
|
||||
- Heading detection and parsing
|
||||
- Content type classification
|
||||
|
||||
### 3. **DOM Utilities**
|
||||
- `setupSectionElement()` - comprehensive section styling
|
||||
- Event handler binding and cleanup
|
||||
- Dynamic CSS injection
|
||||
|
||||
---
|
||||
|
||||
## 📊 **QUANTITATIVE COMPARISON**
|
||||
|
||||
| Feature Category | Old Implementation | Current | Lost Count |
|
||||
|-----------------|-------------------|---------|------------|
|
||||
| **Class Methods** | ~30 methods | ~15 methods | **~15 missing** |
|
||||
| **Event Types** | 6 event types | 3 event types | **3 missing** |
|
||||
| **State Management** | 4 states + pending | Boolean only | **Advanced states** |
|
||||
| **Keyboard Shortcuts** | 3 shortcuts | 0 shortcuts | **3 missing** |
|
||||
| **Save Features** | Smart naming | Basic | **Intelligence lost** |
|
||||
| **Status Tracking** | Real-time | Manual | **Automation lost** |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **PRIORITY RECOVERY LIST**
|
||||
|
||||
### **HIGH PRIORITY (Core Functionality)**
|
||||
1. ✅ Advanced state management with pending changes
|
||||
2. ✅ Keyboard shortcuts (Ctrl+Enter, Escape)
|
||||
3. ✅ Section splitting when adding new headings
|
||||
4. ✅ Real-time status tracking in global panel
|
||||
|
||||
### **MEDIUM PRIORITY (User Experience)**
|
||||
5. ✅ Intelligent save filename generation
|
||||
6. ✅ Professional message system
|
||||
7. ✅ Enhanced status reporting dialog
|
||||
8. ✅ Multiple concurrent editing sessions
|
||||
|
||||
### **LOW PRIORITY (Polish)**
|
||||
9. ✅ Advanced section type detection
|
||||
10. ✅ Comprehensive event system
|
||||
11. ✅ Enhanced DOM utilities
|
||||
12. ✅ Automatic status updates
|
||||
|
||||
---
|
||||
|
||||
## 🚀 **RECOVERY IMPLEMENTATION PLAN**
|
||||
|
||||
### **Phase 1: Core State Management**
|
||||
- Restore `EditState` enum and pending changes
|
||||
- Implement `stopEditing()` with state preservation
|
||||
- Add comprehensive state validation
|
||||
|
||||
### **Phase 2: User Interaction**
|
||||
- Restore keyboard shortcuts
|
||||
- Implement section splitting detection
|
||||
- Add real-time status tracking
|
||||
|
||||
### **Phase 3: Professional Polish**
|
||||
- Restore intelligent filename generation
|
||||
- Implement professional message system
|
||||
- Add comprehensive status reporting
|
||||
|
||||
### **Phase 4: Advanced Features**
|
||||
- Multiple concurrent editing
|
||||
- Enhanced event system
|
||||
- Automatic section type detection
|
||||
|
||||
---
|
||||
|
||||
## 📝 **NOTES**
|
||||
|
||||
- The old implementation was **significantly more sophisticated** with ~2x the functionality
|
||||
- Most lost features were related to **user experience** and **professional polish**
|
||||
- The current basic functionality works but **lacks the refinement** of the older version
|
||||
- Recovery should be **incremental** to avoid breaking existing functionality
|
||||
|
||||
**Total estimated recovery effort:** Major features lost, significant development required to restore full functionality.
|
||||
69
Makefile
69
Makefile
@@ -1,7 +1,7 @@
|
||||
# MarkiTect - Advanced Markdown Engine
|
||||
# Makefile for common development tasks
|
||||
|
||||
.PHONY: help setup install-dev install-home install-home-venv install-deps install-deps-force install-deps-venv install-system list-deps setup-dev test build clean update status lint format check-deps venv-status update-digest add-diary-entry test-status test-new test-coverage test-arch test-foundation test-infrastructure test-integration test-domain test-service test-application test-presentation test-quick test-layers test-random test-random-seed test-random-repeat test-install-randomly test-clean test-tdd test-changed test-module test-cache-clean test-efficient cli-help release-status release-validate release-prepare release-build release-publish release-dry-run chaos-validate chaos-matrix chaos-inject chaos-report cost-help
|
||||
.PHONY: help setup install install-dev uninstall install-home install-home-venv install-user-deps install-force-deps install-deps-venv install-system-deps list-deps setup-dev test build clean update status lint format check-deps venv-status update-digest add-diary-entry test-status test-new test-coverage test-arch test-foundation test-infrastructure test-integration test-domain test-service test-application test-presentation test-quick test-layers test-random test-random-seed test-random-repeat test-install-randomly test-clean test-tdd test-changed test-module test-cache-clean test-efficient cli-help release-status release-validate release-prepare release-build release-publish release-dry-run chaos-validate chaos-matrix chaos-inject chaos-report cost-help
|
||||
|
||||
# Default target
|
||||
help:
|
||||
@@ -13,17 +13,17 @@ help:
|
||||
@echo ""
|
||||
@echo "Setup & Installation:"
|
||||
@echo " setup - Initial project setup (venv + install-dev)"
|
||||
@echo " install - Install markitect globally (recommended)"
|
||||
@echo " install-dev - Install package in development mode"
|
||||
@echo " install-home - Install markitect binary to ~/bin/"
|
||||
@echo " install-deps - Install dependencies (tries user-local first)"
|
||||
@echo " install-deps-force - Force install with --break-system-packages"
|
||||
@echo " install-deps-venv - Install to user virtual environment"
|
||||
@echo " install-home-venv - Install binary using user virtual environment"
|
||||
@echo " install-system - Install system dependencies via apt (requires sudo)"
|
||||
@echo " uninstall - Remove global markitect installation"
|
||||
@echo " list-deps - List required dependencies for markitect"
|
||||
@echo " setup-dev - Install with development dependencies"
|
||||
@echo " venv-status - Check if venv is active"
|
||||
@echo ""
|
||||
@echo "Advanced Installation:"
|
||||
@echo " install-user-deps - Install dependencies to user location only"
|
||||
@echo " install-system-deps - Install dependencies via system packages (sudo)"
|
||||
@echo " install-force-deps - Force install with --break-system-packages"
|
||||
@echo ""
|
||||
@echo "Development:"
|
||||
@echo " test - Run core tests (excluding capability-specific tests)"
|
||||
@echo " test-capabilities - Run all capability-specific tests"
|
||||
@@ -141,6 +141,40 @@ $(VENV)/bin/activate:
|
||||
$(PYTHON) -m venv $(VENV)
|
||||
$(VENV_PIP) install --upgrade pip setuptools wheel
|
||||
|
||||
# Install markitect globally (recommended approach)
|
||||
install:
|
||||
@echo "🚀 Installing MarkiTect globally..."
|
||||
@echo "📦 Creating user virtual environment with dependencies..."
|
||||
@$(MAKE) --no-print-directory install-deps-venv
|
||||
@echo "🏠 Installing markitect binary to ~/bin/..."
|
||||
@$(MAKE) --no-print-directory install-home-venv
|
||||
@echo ""
|
||||
@echo "✅ MarkiTect installed successfully!"
|
||||
@echo "💡 Make sure ~/bin is in your PATH:"
|
||||
@echo " export PATH=\"$$HOME/bin:$$PATH\""
|
||||
@echo ""
|
||||
@echo "🧪 Test installation:"
|
||||
@echo " markitect version"
|
||||
|
||||
# Remove global markitect installation
|
||||
uninstall:
|
||||
@echo "🗑️ Removing MarkiTect global installation..."
|
||||
@if [ -f "$$HOME/bin/markitect" ]; then \
|
||||
echo " Removing binary: $$HOME/bin/markitect"; \
|
||||
rm "$$HOME/bin/markitect"; \
|
||||
echo " ✅ Binary removed"; \
|
||||
else \
|
||||
echo " ℹ️ Binary not found at $$HOME/bin/markitect"; \
|
||||
fi
|
||||
@if [ -d "$$HOME/.local/markitect-venv" ]; then \
|
||||
echo " Removing virtual environment: $$HOME/.local/markitect-venv"; \
|
||||
rm -rf "$$HOME/.local/markitect-venv"; \
|
||||
echo " ✅ Virtual environment removed"; \
|
||||
else \
|
||||
echo " ℹ️ Virtual environment not found"; \
|
||||
fi
|
||||
@echo "✅ MarkiTect uninstalled successfully!"
|
||||
|
||||
# Install package in development mode
|
||||
install-dev: $(VENV)/bin/activate
|
||||
@echo "📦 Installing MarkiTect in development mode..."
|
||||
@@ -215,13 +249,14 @@ list-deps:
|
||||
@echo " toml - TOML configuration parsing"
|
||||
@echo ""
|
||||
@echo "🔧 Installation options:"
|
||||
@echo " make install-deps - Install user-local (recommended)"
|
||||
@echo " make install-system - Install via apt + pip --user (requires sudo)"
|
||||
@echo " make install - Install globally (recommended)"
|
||||
@echo " make install-user-deps - Install user-local dependencies only"
|
||||
@echo " make install-system-deps - Install via apt + pip --user (requires sudo)"
|
||||
@echo " pip3 install --user [packages] - Manual user-local installation"
|
||||
@echo " pip install -e . - Install from project directory (dev mode)"
|
||||
|
||||
# Install user-local dependencies for markitect (no sudo needed)
|
||||
install-deps:
|
||||
install-user-deps:
|
||||
@echo "📦 Installing MarkiTect dependencies (user-local)..."
|
||||
@echo "🐍 Target Python: $$(which python3) (version: $$(python3 --version))"
|
||||
@echo "📍 pip3 location: $$(which pip3)"
|
||||
@@ -233,12 +268,12 @@ install-deps:
|
||||
echo "❌ User-local installation failed (externally-managed-environment)"; \
|
||||
echo ""; \
|
||||
echo "🔧 Alternative solutions:"; \
|
||||
echo " 1. Use system packages: make install-system"; \
|
||||
echo " 2. Override restriction: make install-deps-force"; \
|
||||
echo " 1. Use system packages: make install-system-deps"; \
|
||||
echo " 2. Override restriction: make install-force-deps"; \
|
||||
echo " 3. Create user venv: make install-deps-venv"; \
|
||||
echo " 4. Use development setup: make setup"; \
|
||||
echo ""; \
|
||||
echo "💡 Recommended: Try 'make install-system' first"; \
|
||||
echo "💡 Recommended: Try 'make install' for complete setup"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "🧪 Testing import..."
|
||||
@@ -246,7 +281,7 @@ install-deps:
|
||||
@echo "💡 You can now use 'markitect' command if it's in your PATH"
|
||||
|
||||
# Force install user-local dependencies (overrides externally-managed restriction)
|
||||
install-deps-force:
|
||||
install-force-deps:
|
||||
@echo "📦 Force installing MarkiTect dependencies (overriding restrictions)..."
|
||||
@echo "⚠️ This uses --break-system-packages flag"
|
||||
@echo " Only use if you understand the implications"
|
||||
@@ -287,7 +322,7 @@ install-deps-venv:
|
||||
@echo "💡 To use this, run 'make install-home-venv' instead of 'make install-home'"
|
||||
|
||||
# Install system dependencies via apt (requires sudo)
|
||||
install-system:
|
||||
install-system-deps:
|
||||
@echo "📦 Installing MarkiTect dependencies via apt..."
|
||||
@echo "⚠️ This requires sudo and installs system packages"
|
||||
@echo ""
|
||||
@@ -313,7 +348,7 @@ install-system:
|
||||
echo "💡 You can now use 'markitect' command if it's in your PATH"; \
|
||||
else \
|
||||
echo "❌ Installation cancelled"; \
|
||||
echo "💡 Alternative: Use 'make install-deps' for user-local installation"; \
|
||||
echo "💡 Alternative: Use 'make install' for automated setup"; \
|
||||
fi
|
||||
|
||||
# Install with development dependencies
|
||||
|
||||
113
TEST_ENVIRONMENT.md
Normal file
113
TEST_ENVIRONMENT.md
Normal file
@@ -0,0 +1,113 @@
|
||||
# HTML Editor Test Environment
|
||||
|
||||
## 🎯 Overview
|
||||
|
||||
This test environment allows for comprehensive testing of the MarkiTect HTML editor functionality using Node.js and headless browser testing.
|
||||
|
||||
## 🛠️ Available Tools
|
||||
|
||||
### 1. Basic Test Runner (`test_runner.js`)
|
||||
```bash
|
||||
node test_runner.js [html-file-path]
|
||||
```
|
||||
- Structural validation
|
||||
- Function availability checking
|
||||
- Basic DOM testing
|
||||
|
||||
### 2. E2E Test Suite (`e2e_tests.js`)
|
||||
```bash
|
||||
node e2e_tests.js [html-file-path]
|
||||
```
|
||||
- Comprehensive functionality testing
|
||||
- Interactive behavior validation
|
||||
- Button functionality verification
|
||||
|
||||
### 3. Button Debug Tool (`debug_buttons.js`)
|
||||
```bash
|
||||
node debug_buttons.js [html-file-path]
|
||||
```
|
||||
- Detailed button creation analysis
|
||||
- Event handler verification
|
||||
- DOM interaction simulation
|
||||
|
||||
## 🧪 Test Results Summary
|
||||
|
||||
### ✅ **Working Features:**
|
||||
1. **Section Detection**: 7 sections created (2 image sections detected)
|
||||
2. **Click Handling**: All sections respond to clicks correctly
|
||||
3. **Image Editor**: Image editor dialog opens successfully
|
||||
4. **Button Creation**: All 7 buttons created with proper handlers
|
||||
5. **Auto-resize**: Textarea auto-resize functionality working
|
||||
6. **Debug System**: Console-based debug logging active
|
||||
|
||||
### 🎯 **Verified Functionality:**
|
||||
- ✅ Section editing for text sections
|
||||
- ✅ Image editor dialog for image sections
|
||||
- ✅ Button event binding (Replace, Resize, Caption, Remove)
|
||||
- ✅ Global controls (Save, Reset, Status)
|
||||
- ✅ Auto-resizing textareas
|
||||
- ✅ Proper CSS styling and visual feedback
|
||||
|
||||
## 🚀 TDD Workflow
|
||||
|
||||
### For New Features:
|
||||
1. **Write Test First**: Add test case to e2e_tests.js
|
||||
2. **Run Test**: `node e2e_tests.js /path/to/test.html`
|
||||
3. **See Red**: Test should fail initially
|
||||
4. **Implement Feature**: Add code to editor.js
|
||||
5. **See Green**: Re-run test to verify fix
|
||||
6. **Refactor**: Clean up implementation
|
||||
|
||||
### For Bug Fixes:
|
||||
1. **Reproduce Issue**: Use debug_buttons.js to identify problem
|
||||
2. **Create Test**: Add test case that reproduces the bug
|
||||
3. **Fix Implementation**: Update editor.js
|
||||
4. **Verify Fix**: Run comprehensive tests
|
||||
|
||||
## 📊 Test File Locations
|
||||
|
||||
- **Test Files**: `/tmp/test_*.html`
|
||||
- **Latest Working**: `/tmp/test_final_comprehensive.html`
|
||||
- **Source Editor**: `/home/worsch/markitect_project/markitect/static/editor.js`
|
||||
|
||||
## 🔧 Debug Commands
|
||||
|
||||
### Quick Structural Check:
|
||||
```bash
|
||||
node test_runner.js /tmp/test_final_comprehensive.html
|
||||
```
|
||||
|
||||
### Full Functionality Test:
|
||||
```bash
|
||||
node e2e_tests.js /tmp/test_final_comprehensive.html
|
||||
```
|
||||
|
||||
### Button Behavior Analysis:
|
||||
```bash
|
||||
node debug_buttons.js /tmp/test_final_comprehensive.html
|
||||
```
|
||||
|
||||
### Generate Fresh Test HTML:
|
||||
```bash
|
||||
MARKITECT_EDIT_MODE=true markitect md-render /tmp/test_regular_images.md --output /tmp/new_test.html
|
||||
```
|
||||
|
||||
## 🎉 Success Criteria
|
||||
|
||||
All tests should show:
|
||||
- ✅ 6/6 basic tests passing
|
||||
- ✅ DOM environment loads successfully
|
||||
- ✅ 7 sections created (2 image sections)
|
||||
- ✅ Image editor opens on image click
|
||||
- ✅ All buttons have event handlers
|
||||
- ✅ Console debug messages active
|
||||
|
||||
## 🐛 Common Issues
|
||||
|
||||
If buttons aren't working in the browser but tests pass:
|
||||
1. Check browser console for JavaScript errors
|
||||
2. Verify `this` context binding in arrow functions
|
||||
3. Ensure sectionId is properly captured in closures
|
||||
4. Check for event propagation issues
|
||||
|
||||
The test environment provides a complete TDD workflow for continuing development! 🚀
|
||||
89
TODO.md
Normal file
89
TODO.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# Todofile
|
||||
|
||||
This is a "to do next" file, particularly useful to keep the human and a coding assistant in sync.
|
||||
|
||||
The format is based on [Keep a Todofile V0.0.1](https://coulomb.social/open/KeepaTodofile).
|
||||
|
||||
The structure organizes **future tasks** by their impact, just as a changelog organizes past changes by their impact.
|
||||
|
||||
***
|
||||
|
||||
## [Unreleased] - *Active Vibe-Coding State* 💡
|
||||
|
||||
This section is for tasks currently being discussed with or worked on by the coding assistant. These are the ephemeral, flow-of-thought tasks.
|
||||
|
||||
**📊 STATUS UPDATE (2025-11-02)**: Systematic JavaScript functionality recovery using TDD methodology has made excellent progress. **5 major features** have been successfully implemented and tested:
|
||||
|
||||
1. **Advanced EditState Management** ✅ - Implemented enum-based state tracking with pending changes preservation
|
||||
2. **Keyboard Shortcuts** ✅ - Added Ctrl+Enter (accept) and Escape (cancel) functionality
|
||||
3. **Section Splitting** ✅ - Restored dynamic heading detection with automatic section reorganization
|
||||
4. **Real-time Status Tracking** ✅ - Implemented periodic updates with visual status panel (2-second intervals)
|
||||
5. **Intelligent Filename Generation** ✅ - Added 4-method fallback system (options→title→URL→heading→timestamp)
|
||||
|
||||
All implementations include comprehensive TDD test suites and are fully integrated into the existing codebase. The recovery approach has proven highly effective for restoring sophisticated lost functionality.
|
||||
|
||||
* **To Add:**
|
||||
* ✅ Advanced state management with EditState enum and pending changes (CRITICAL) - COMPLETED
|
||||
* ✅ Keyboard shortcuts (Ctrl+Enter accept, Escape cancel) (CRITICAL) - COMPLETED
|
||||
* ✅ Section splitting functionality for dynamic heading detection (HIGH) - COMPLETED
|
||||
* ✅ Real-time status tracking with periodic updates (HIGH) - COMPLETED
|
||||
* ✅ Intelligent save filename generation with 4-method fallback (MEDIUM) - COMPLETED
|
||||
* 🚧 Professional message system with color-coded positioning (MEDIUM) - IN PROGRESS
|
||||
* Multiple concurrent editing sessions support (MEDIUM)
|
||||
* Enhanced DOM event system with 6 event types (LOW)
|
||||
* Automatic section type detection (heading, code, list, etc) (LOW)
|
||||
* Sophisticated section ID generation with hash-based algorithm (LOW)
|
||||
|
||||
* **To Fix:**
|
||||
* Comprehensive status reporting dialog with detailed stats (HIGH)
|
||||
* Floating global control panel with professional styling (MEDIUM)
|
||||
* Enhanced setupSectionElement with comprehensive styling (LOW)
|
||||
|
||||
* **To Refactor:**
|
||||
* ✅ stopEditing method with state preservation (CRITICAL) - COMPLETED
|
||||
* ✅ getAllSections method for section collection management (MEDIUM) - COMPLETED
|
||||
* ✅ hasChanges detection for unsaved modifications (HIGH) - COMPLETED
|
||||
* ✅ updateGlobalStatus method with 2-second interval updates (MEDIUM) - COMPLETED
|
||||
* ✅ handleSectionSplit for dynamic section reorganization (LOW) - COMPLETED
|
||||
* ✅ checkForSectionSplits automatic heading detection (LOW) - COMPLETED
|
||||
|
||||
* **To Remove:**
|
||||
* None currently identified
|
||||
|
||||
|
||||
***
|
||||
|
||||
## Completed Tasks
|
||||
|
||||
**Asset Shipping for md-render - COMPLETED ✅**:
|
||||
- ✅ Implemented automatic asset copying when rendering markdown to different output directories
|
||||
- ✅ Added asset discovery functionality parsing markdown for image/link references
|
||||
- ✅ Implemented timestamp-based asset copying (only copy if source newer than destination)
|
||||
- ✅ Added `--ship-assets` and `--no-ship-assets` CLI flags for explicit control
|
||||
- ✅ Added `MARKITECT_OUTPUT_DIR` environment variable support for default output directory
|
||||
- ✅ Smart defaults: assets ship automatically when output is directory, disabled for specific files
|
||||
- ✅ Preserved relative path structure in output directory maintaining markdown link compatibility
|
||||
- ✅ Graceful handling of missing assets with warning messages
|
||||
- ✅ Full backward compatibility with existing md-render workflows
|
||||
- ✅ Comprehensive TDD test suite covering all functionality and edge cases
|
||||
|
||||
**Feature Capabilities**:
|
||||
- Environment variable priority: CLI `--output` > `MARKITECT_OUTPUT_DIR` > input file directory
|
||||
- Automatic asset discovery from standard markdown syntax: `` and `[text](path)`
|
||||
- Timestamp-based incremental copying prevents unnecessary file operations
|
||||
- Directory structure preservation maintains working relative links in output HTML
|
||||
- Support for images, documents, and other asset types referenced in markdown
|
||||
|
||||
**CHANGELOG.md Enhancement - COMPLETED ✅**:
|
||||
- ✅ Added missing version entries for 0.1.0, 0.2.0, and 0.3.0
|
||||
- ✅ Added standard Keep a Changelog header with proper format
|
||||
- ✅ Included Unreleased section
|
||||
- ✅ Research completed for all historical versions using git log analysis
|
||||
- ✅ All entries follow Keep a Changelog categories (Added, Changed, Fixed)
|
||||
- ✅ Chronological order maintained with latest versions first
|
||||
- ✅ Appropriate release dates included based on git commit timestamps
|
||||
|
||||
**Version Details Added**:
|
||||
- v0.1.0 (2025-10-15): Development infrastructure, TDD workspace, issue management
|
||||
- v0.2.0 (2025-10-20): Advanced Markdown Engine with GraphQL, search, plugins
|
||||
- v0.3.0 (2025-10-25): Architectural improvements with kaizen-agentic integration
|
||||
449
UserInterfaceFramework.md
Normal file
449
UserInterfaceFramework.md
Normal file
@@ -0,0 +1,449 @@
|
||||
# User Interface Framework Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
This document defines the canonical terminology and specifications for all UI components in the Markitect markdown editor interface. This framework establishes a common vocabulary for interface evolution discussions and future development.
|
||||
|
||||
## Component Architecture
|
||||
|
||||
The editor interface consists of 6 main components organized in layers:
|
||||
|
||||
### Layer Priority (Z-Index)
|
||||
1. **Toast Notifications** (z-index: 10001) - Highest priority
|
||||
2. **Editor Floating Action Panel** (z-index: 1000) - High priority
|
||||
3. **Modal Dialogs** (z-index: 999) - Modal layer
|
||||
4. **Inline Section Editors** (z-index: 100) - Contextual editing
|
||||
5. **Document Canvas** (z-index: 1) - Content layer
|
||||
6. **Background** (z-index: 0) - Base layer
|
||||
|
||||
---
|
||||
|
||||
## 1. Editor Floating Action Panel
|
||||
|
||||
**Component Name**: `Editor`
|
||||
**Type**: Floating action panel with status indicator
|
||||
**Location**: Top-right corner (fixed positioning)
|
||||
|
||||
### Description
|
||||
A persistent control hub providing document-level actions and real-time status feedback. Always visible and contextually aware of editing state.
|
||||
|
||||
### Technical Specifications
|
||||
- **Container ID**: `ui-edit-floater`
|
||||
- **CSS Classes**: `ui-edit-floater-panel`
|
||||
- **Position**: `position: fixed; top: 20px; right: 20px;`
|
||||
- **Z-Index**: 1000
|
||||
- **Update Frequency**: Status refreshes every 2 seconds via `setInterval`
|
||||
|
||||
### Components
|
||||
1. **Header Section**
|
||||
- **Title**: "📝 Editor" (emoji + text)
|
||||
- **Status Display**: Dynamic text showing current state
|
||||
|
||||
2. **Action Buttons**
|
||||
- **💾 Save Document** (green accept style)
|
||||
- **🔄 Reset All** (orange reset style)
|
||||
- **📊 Show Status** (grey secondary style)
|
||||
|
||||
### Status States
|
||||
- `"Ready"` - Default idle state
|
||||
- `"Editing [N] section(s)"` - Active editing in progress
|
||||
- `"[N] section(s) modified"` - Unsaved changes exist
|
||||
- `"All sections saved ✓"` - All work is saved (with checkmark)
|
||||
|
||||
### Theme Integration
|
||||
- Colors and styling adapt to selected UI theme (standard, greyscale, electric, psychedelic)
|
||||
- Header text color matches theme text color
|
||||
- Panel background follows theme panel styling
|
||||
|
||||
---
|
||||
|
||||
## 2. Toast Notification System
|
||||
|
||||
**Component Name**: `Toast`
|
||||
**Type**: Auto-dismissing temporary status messages
|
||||
**Location**: Top-center (horizontally centered)
|
||||
|
||||
### Description
|
||||
Provides immediate visual feedback for user actions through temporary, non-blocking messages that appear and automatically disappear.
|
||||
|
||||
### Technical Specifications
|
||||
- **Position**: `position: fixed; top: 20px; left: 50%; transform: translateX(-50%);`
|
||||
- **Z-Index**: 10001 (highest priority)
|
||||
- **Auto-Dismiss**: 3 seconds
|
||||
- **Max Width**: 400px
|
||||
- **Animation**: Smooth appear/disappear
|
||||
|
||||
### Message Types
|
||||
1. **Success Toast** (green `#28a745`)
|
||||
- "Document saved as: [filename]"
|
||||
- "✂️ Section split into [N] sections!"
|
||||
|
||||
2. **Info Toast** (blue `#007acc`)
|
||||
- "Document reset to original structure"
|
||||
|
||||
3. **Error Toast** (red `#dc3545`)
|
||||
- Error condition messages
|
||||
|
||||
### Visual Styling
|
||||
- **Shape**: Rounded corners (4px border-radius)
|
||||
- **Typography**: White text, 14px font size, center aligned
|
||||
- **Shadow**: `0 2px 8px rgba(0,0,0,0.2)`
|
||||
- **Padding**: `12px 20px`
|
||||
|
||||
---
|
||||
|
||||
## 3. Document Canvas
|
||||
|
||||
**Component Name**: `Document` or `Canvas`
|
||||
**Type**: Main content rendering area
|
||||
**Location**: Central content area
|
||||
|
||||
### Description
|
||||
The primary workspace where markdown content is rendered and made interactive for editing. Displays content as formatted HTML while providing editing affordances.
|
||||
|
||||
### Technical Specifications
|
||||
- **Container ID**: `markdown-content`
|
||||
- **CSS Classes**: Content uses semantic classes (`ui-edit-section`)
|
||||
- **Layout**: Responsive, centered with max-width constraints
|
||||
- **Interaction**: Click-to-edit paradigm
|
||||
|
||||
### Section Elements
|
||||
Each content section is individually interactive:
|
||||
- **Hover Effect**: Subtle background (`rgba(0, 0, 0, 0.02)`) and border hint
|
||||
- **Click Target**: Entire section area is clickable
|
||||
- **Visual Feedback**: Smooth transitions (0.2s ease)
|
||||
- **Section Types**: Headings, paragraphs, lists, code blocks, blockquotes
|
||||
|
||||
### Content Rendering
|
||||
- **Primary**: Uses `marked.js` for markdown parsing
|
||||
- **Fallback**: Basic HTML conversion if library fails
|
||||
- **Graceful Degradation**: Always displays content, even with errors
|
||||
|
||||
---
|
||||
|
||||
## 4. Inline Section Editor
|
||||
|
||||
**Component Name**: `Section Editor` or `Inline Editor`
|
||||
**Type**: Contextual editing widget
|
||||
**Location**: Replaces section content during editing
|
||||
|
||||
### Description
|
||||
A contextual editing interface that appears when a section is activated for editing. Provides textarea input and action controls for section-level operations.
|
||||
|
||||
### Technical Specifications
|
||||
- **Container CSS**: `ui-edit-inline-panel`
|
||||
- **Layout**: Horizontal flex layout (textarea + button column)
|
||||
- **Theme Integration**: Inherits floating panel styling from active UI theme
|
||||
- **Focus Management**: Auto-focus on textarea when activated
|
||||
|
||||
### Components
|
||||
1. **Textarea**
|
||||
- **CSS Classes**: `ui-edit-textarea ui-edit-textarea-main`
|
||||
- **Font**: Monospace font family for code editing
|
||||
- **Features**: Vertical resize, focus styling, theme-aware colors
|
||||
|
||||
2. **Action Buttons** (vertical column)
|
||||
- **✓ Accept** (`ui-edit-button-accept`) - Save changes
|
||||
- **✗ Cancel** (`ui-edit-button-cancel`) - Discard changes
|
||||
- **🔄 Reset** (`ui-edit-button-reset`) - Restore original content
|
||||
|
||||
### Behavior
|
||||
- **Multi-Section**: Supports multiple concurrent section editing
|
||||
- **State Persistence**: Maintains editing state until explicitly resolved
|
||||
- **Keyboard Support**: Planned for future enhancement
|
||||
- **Auto-Split**: Automatically splits sections when new headings are added
|
||||
|
||||
---
|
||||
|
||||
## 5. Status Information Modal
|
||||
|
||||
**Component Name**: `Status Modal` or `Info Dialog`
|
||||
**Type**: Modal dialog for comprehensive status display
|
||||
**Location**: Center screen (modal overlay)
|
||||
|
||||
### Description
|
||||
Provides detailed information about the current editing session, including version info, document statistics, file details, and help documentation.
|
||||
|
||||
### Current Implementation
|
||||
- **Method**: Browser native `alert()` (temporary solution)
|
||||
- **Trigger**: "📊 Show Status" button in floating action panel
|
||||
- **Content**: Multi-section formatted text
|
||||
|
||||
### Information Sections
|
||||
1. **Application Header**
|
||||
- Application name and version
|
||||
- Git commit info and development status
|
||||
|
||||
2. **File Information**
|
||||
- Generated save filename
|
||||
- Source filename
|
||||
- Current URL
|
||||
|
||||
3. **Document Statistics**
|
||||
- Total sections count
|
||||
- Modified sections count
|
||||
- Currently editing sections count
|
||||
- Unsaved changes indicator
|
||||
|
||||
4. **Help Documentation**
|
||||
- Section behavior explanation
|
||||
- Editing controls reference
|
||||
- Keyboard shortcuts (future)
|
||||
|
||||
### Future Enhancement Plan
|
||||
**Target**: Replace browser alert with custom modal dialog
|
||||
- **Styling**: Theme-aware modal with proper typography
|
||||
- **Interaction**: Close button, better formatting
|
||||
- **Features**: Copy-to-clipboard, expandable sections
|
||||
- **Accessibility**: Proper ARIA labels, keyboard navigation
|
||||
|
||||
---
|
||||
|
||||
## 6. Confirmation Dialog
|
||||
|
||||
**Component Name**: `Confirmation Dialog`
|
||||
**Type**: Modal confirmation for destructive actions
|
||||
**Location**: Center screen (modal overlay)
|
||||
|
||||
### Description
|
||||
Provides user confirmation for potentially destructive operations that cannot be easily undone.
|
||||
|
||||
### Current Implementation ✅ COMPLETED
|
||||
- **Method**: Custom theme-aware modal dialog
|
||||
- **Trigger**: "🔄 Reset All" button in floating action panel
|
||||
- **Message**: "Reset all content to original markdown?"
|
||||
- **Warning**: "This will permanently lose all edits and remove any split sections. This action cannot be undone."
|
||||
|
||||
### Features Implemented
|
||||
- **Theme-Aware Styling**: Adapts to all UI themes (standard, greyscale, electric, psychedelic)
|
||||
- **Clear Action Buttons**:
|
||||
- Primary action: "Reset Document" (red danger button)
|
||||
- Secondary action: "Keep Changes" (grey cancel button)
|
||||
- **Enhanced UX**:
|
||||
- Detailed consequence explanation with warning styling
|
||||
- Professional modal overlay with smooth animations
|
||||
- Proper focus management and accessibility
|
||||
- **Keyboard Support**:
|
||||
- ESC key to cancel
|
||||
- Enter key to confirm
|
||||
- Tab navigation between buttons
|
||||
|
||||
### Use Cases
|
||||
- **Reset All Sections**: Complete document reset to original state
|
||||
- **Future**: Extensible for delete operations, bulk changes, file operations
|
||||
|
||||
### Technical Implementation
|
||||
**CSS Classes**:
|
||||
- `.ui-edit-confirmation-modal` - Modal container
|
||||
- `.ui-edit-confirmation-content` - Main message
|
||||
- `.ui-edit-confirmation-warning` - Warning section
|
||||
- `.ui-edit-confirmation-buttons` - Button container
|
||||
- `.ui-edit-button-confirm` - Danger action button
|
||||
- `.ui-edit-button-cancel` - Cancel action button
|
||||
|
||||
**JavaScript Method**: `showConfirmation(message, confirmText, cancelText, warningText)`
|
||||
- Returns Promise<boolean> for async/await support
|
||||
- Theme-consistent styling via layered theme system
|
||||
- Proper event cleanup and accessibility features
|
||||
|
||||
---
|
||||
|
||||
## 7. Insert Mode Editor
|
||||
|
||||
**Component Name**: `Insert Mode Editor`
|
||||
**Type**: Structured editing mode with heading protection
|
||||
**Location**: Replaces section content during editing (contextual)
|
||||
|
||||
### Description ✅ COMPLETED
|
||||
A specialized editing mode that duplicates edit mode functionality while enforcing document structure integrity. Provides content editing with selective heading protection for levels 1-3, maintaining document outline consistency.
|
||||
|
||||
### Current Implementation ✅ COMPLETED
|
||||
- **CLI Activation**: `markitect md-render document.md --insert`
|
||||
- **Mode Detection**: Uses `MARKITECT_INSERT_MODE` JavaScript flag
|
||||
- **Heading Protection**: Levels 1-3 are read-only, displayed above content editor
|
||||
- **Content Editing**: Full editing capability for content following protected headings
|
||||
|
||||
### Features Implemented
|
||||
- **Structured Editing Interface**:
|
||||
- Protected heading display (read-only) for levels 1-3
|
||||
- Content-only textarea for body text editing
|
||||
- Level 4+ headings remain fully editable
|
||||
- **Heading Protection Logic**:
|
||||
- Visual distinction with warning-styled heading display
|
||||
- Prevents modification of heading text in protected sections
|
||||
- Server-side validation ensures heading integrity
|
||||
- **Section Management**:
|
||||
- Automatic section splitting on new heading introduction
|
||||
- New heading sections inherit protection based on level
|
||||
- Maintains document structure during complex edits
|
||||
- **Theme Integration**:
|
||||
- Adapts to all UI themes (standard, greyscale, electric, psychedelic)
|
||||
- Consistent styling with edit mode components
|
||||
- Special styling for protected heading display
|
||||
|
||||
### Use Cases
|
||||
- **Document Structure Preservation**: Maintain established outline while allowing content updates
|
||||
- **Collaborative Editing**: Prevent accidental heading modifications in shared documents
|
||||
- **Template-Based Content**: Edit content within predefined structural frameworks
|
||||
- **Controlled Authoring**: Allow content contributions without structural changes
|
||||
|
||||
### Technical Implementation
|
||||
**CLI Integration**:
|
||||
- `--insert` flag added to `md-render` command
|
||||
- Mutually exclusive with `--edit` flag
|
||||
- Validation prevents simultaneous mode activation
|
||||
|
||||
**CSS Classes**:
|
||||
- `.markitect-insert-mode` - Body class for insert mode
|
||||
- `.ui-insert-protected-panel` - Container for protected heading sections
|
||||
- `.ui-insert-heading-display` - Read-only heading display component
|
||||
- `.ui-insert-content-editor` - Content-only editing textarea
|
||||
|
||||
**JavaScript Configuration**:
|
||||
```javascript
|
||||
const MARKITECT_INSERT_MODE = true;
|
||||
const MARKITECT_EDITOR_CONFIG = {
|
||||
mode: 'insert',
|
||||
restrictedHeadingLevels: [1, 2, 3],
|
||||
// ... standard editor config
|
||||
};
|
||||
```
|
||||
|
||||
**Section Enhancement**:
|
||||
- `Section.detectHeadingLevel()` - Identify heading levels 1-6
|
||||
- `Section.isProtectedHeading()` - Check if heading is protected in current mode
|
||||
- `Section.getHeadingText()` - Extract heading text for display
|
||||
- `Section.getHeadingContent()` - Extract content after heading for editing
|
||||
|
||||
**Validation Logic**:
|
||||
- Pre-acceptance validation ensures protected headings remain unchanged
|
||||
- Error handling for attempted heading modifications
|
||||
- Content reconstruction maintains heading + content structure
|
||||
|
||||
### Behavioral Differences from Edit Mode
|
||||
| Feature | Edit Mode | Insert Mode |
|
||||
|---------|-----------|-------------|
|
||||
| Heading Levels 1-3 | ✏️ Fully Editable | 🔒 Read-Only Display |
|
||||
| Heading Levels 4-6 | ✏️ Fully Editable | ✏️ Fully Editable |
|
||||
| Content Editing | ✏️ Full Section | ✏️ Content Only (for protected) |
|
||||
| Section Splitting | ✅ All Headings | ✅ All Headings |
|
||||
| New Heading Creation | ✅ Unlimited | ✅ With Level-Based Protection |
|
||||
| Theme Support | ✅ All Themes | ✅ All Themes |
|
||||
|
||||
### Future Enhancements
|
||||
- **Configurable Protection Levels**: Allow customization of which heading levels are protected
|
||||
- **Conditional Protection**: Enable/disable protection based on section content or metadata
|
||||
- **Protection Indicators**: Visual badges showing protection status in section list
|
||||
- **Bulk Mode Switching**: Convert between edit and insert modes for existing documents
|
||||
|
||||
---
|
||||
|
||||
## Design Principles
|
||||
|
||||
### 1. **Theme Consistency**
|
||||
All components must adapt to the selected UI theme:
|
||||
- **Standard**: Light grey palette with blue accents
|
||||
- **Greyscale**: Monochromatic grey scale
|
||||
- **Electric**: Dark blue with cyan/yellow accents and glow effects
|
||||
- **Psychedelic**: Vibrant gradient backgrounds with white text
|
||||
|
||||
### 2. **Non-Blocking Interactions**
|
||||
- **Toast notifications**: Auto-dismiss, don't require user action
|
||||
- **Floating action panel**: Always accessible, doesn't block content
|
||||
- **Inline editors**: Contextual, don't interfere with other sections
|
||||
|
||||
### 3. **Graceful Degradation**
|
||||
- **Content always visible**: Even if JavaScript fails
|
||||
- **Progressive enhancement**: Core functionality works without advanced features
|
||||
- **Fallback implementations**: Basic browser dialogs until custom implementations ready
|
||||
|
||||
### 4. **Responsive Design**
|
||||
- **Mobile-first**: Components adapt to smaller screens
|
||||
- **Touch-friendly**: Appropriate touch targets and gestures
|
||||
- **Scalable**: Works across different zoom levels and resolutions
|
||||
|
||||
### 5. **Accessibility**
|
||||
- **Keyboard navigation**: All interactive elements accessible via keyboard
|
||||
- **Screen reader support**: Proper ARIA labels and semantic markup
|
||||
- **High contrast**: Sufficient color contrast ratios in all themes
|
||||
- **Focus management**: Clear focus indicators and logical tab order
|
||||
|
||||
---
|
||||
|
||||
## Development Conventions
|
||||
|
||||
### CSS Class Naming
|
||||
**Pattern**: `{scope}-{component}-{element}-{modifier}`
|
||||
|
||||
**Scopes**:
|
||||
- `ui` - User interface elements
|
||||
- `md` - Mode (light/dark)
|
||||
- `dc` - Document content
|
||||
- `br` - Branding
|
||||
|
||||
**Examples**:
|
||||
- `ui-edit-floater-panel`
|
||||
- `ui-edit-button-accept`
|
||||
- `ui-edit-textarea-main`
|
||||
- `ui-edit-section-frame`
|
||||
|
||||
### JavaScript Event Naming
|
||||
**Pattern**: `{action}-{target}`
|
||||
|
||||
**Examples**:
|
||||
- `edit-started`
|
||||
- `changes-accepted`
|
||||
- `section-split`
|
||||
- `content-updated`
|
||||
|
||||
### Component State Management
|
||||
- **Centralized**: Section state managed by `SectionManager`
|
||||
- **Event-driven**: Components communicate via events
|
||||
- **Immutable updates**: State changes create new state objects
|
||||
- **Consistent**: Same patterns across all components
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancement Roadmap
|
||||
|
||||
### Phase 1: Modal System Replacement
|
||||
- Replace browser `alert()` and `confirm()` with custom implementations
|
||||
- Add proper theme integration and accessibility features
|
||||
- Implement keyboard navigation and focus management
|
||||
|
||||
### Phase 2: Enhanced Interactions
|
||||
- Add keyboard shortcuts for common operations
|
||||
- Implement drag-and-drop section reordering
|
||||
- Add section templates and quick-insert functionality
|
||||
|
||||
### Phase 3: Advanced Features
|
||||
- Multi-document editing with tabs
|
||||
- Real-time collaboration indicators
|
||||
- Advanced search and replace within sections
|
||||
- Export options beyond basic markdown
|
||||
|
||||
### Phase 4: Performance Optimization
|
||||
- Virtual scrolling for large documents
|
||||
- Lazy loading of section editors
|
||||
- Optimized rendering for mobile devices
|
||||
- Advanced caching strategies
|
||||
|
||||
---
|
||||
|
||||
## Component Integration Matrix
|
||||
|
||||
| Component | Theme Aware | Mobile Ready | Keyboard Nav | Touch Friendly | Accessible |
|
||||
|-----------|-------------|--------------|--------------|----------------|------------|
|
||||
| Editor Panel | ✅ Yes | ⚠️ Partial | ❌ Planned | ⚠️ Basic | ⚠️ Partial |
|
||||
| Toast System | ❌ No | ✅ Yes | ❌ N/A | ✅ Yes | ⚠️ Basic |
|
||||
| Document Canvas | ✅ Yes | ✅ Yes | ⚠️ Partial | ✅ Yes | ✅ Yes |
|
||||
| Section Editor | ✅ Yes | ⚠️ Partial | ⚠️ Basic | ⚠️ Basic | ⚠️ Partial |
|
||||
| Insert Mode Editor | ✅ Yes | ⚠️ Partial | ⚠️ Basic | ⚠️ Basic | ⚠️ Partial |
|
||||
| Status Modal | ❌ No | ❌ No | ❌ No | ❌ No | ❌ No |
|
||||
| Confirmation | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
|
||||
|
||||
**Legend**: ✅ Full Support | ⚠️ Partial/Needs Work | ❌ Not Implemented
|
||||
|
||||
---
|
||||
|
||||
This framework provides the foundation for consistent UI development and evolution. All future interface changes should reference these component definitions and maintain the established patterns and conventions.
|
||||
139
demo_clean_editor.html
Normal file
139
demo_clean_editor.html
Normal file
@@ -0,0 +1,139 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Clean Section Editor Demo</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
||||
<style>
|
||||
body {
|
||||
font-family: system-ui, -apple-system, sans-serif;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
#markdown-content {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
margin: 20px 0;
|
||||
min-height: 400px;
|
||||
}
|
||||
.demo-info {
|
||||
background: #e3f2fd;
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.demo-info h2 {
|
||||
margin-top: 0;
|
||||
color: #1976d2;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="demo-info">
|
||||
<h2>🎯 Clean Section Editor Demo</h2>
|
||||
<p><strong>This demonstrates the new TDD-driven, object-oriented section editor architecture.</strong></p>
|
||||
<ul>
|
||||
<li>✅ <strong>Stable</strong>: No content bleeding between sections</li>
|
||||
<li>✅ <strong>Testable</strong>: Business logic separated from DOM</li>
|
||||
<li>✅ <strong>Reliable</strong>: Proper state management</li>
|
||||
<li>✅ <strong>User-friendly</strong>: Clear visual feedback and controls</li>
|
||||
</ul>
|
||||
<p><strong>Instructions:</strong></p>
|
||||
<ol>
|
||||
<li>Click on any section below to start editing</li>
|
||||
<li>Make changes and notice the yellow background (modified state)</li>
|
||||
<li>Use the buttons on the right: Accept ✓, Cancel ✗, Reset 🔄</li>
|
||||
<li>Try clicking between sections - your changes are preserved!</li>
|
||||
<li>Use the control panel on the left for document-level actions</li>
|
||||
</ol>
|
||||
<p><strong>Keyboard shortcuts:</strong> Ctrl+Enter (Accept), Escape (Cancel), Ctrl+S (Save), Ctrl+R (Reset All)</p>
|
||||
</div>
|
||||
|
||||
<div id="markdown-content"></div>
|
||||
|
||||
<!-- Include our clean architecture -->
|
||||
<script src="src/section_editor.js"></script>
|
||||
<script src="src/dom_renderer.js"></script>
|
||||
<script src="src/clean_editor_integration.js"></script>
|
||||
|
||||
<script>
|
||||
// Sample markdown content for demo
|
||||
const DEMO_MARKDOWN = `# Clean Section Editor Demo
|
||||
|
||||
This is the introduction paragraph. Click on this text to start editing it!
|
||||
|
||||
## Key Features
|
||||
|
||||
The new architecture provides several improvements:
|
||||
|
||||
- **Stable editing**: No more content bleeding between sections
|
||||
- **Reliable state management**: Clear separation of concerns
|
||||
- **Test-driven development**: Every component is thoroughly tested
|
||||
- **User-friendly interface**: Visual feedback and intuitive controls
|
||||
|
||||
## How It Works
|
||||
|
||||
### Section Class
|
||||
Each section has its own state management with clear transitions between original, editing, modified, and saved states.
|
||||
|
||||
### SectionManager
|
||||
Coordinates all sections and handles the business logic for document-level operations.
|
||||
|
||||
### DOMRenderer
|
||||
Handles all DOM manipulation and UI events, keeping the business logic clean and testable.
|
||||
|
||||
## Try It Out
|
||||
|
||||
Click on any section above to start editing. Notice how:
|
||||
|
||||
1. **Visual feedback**: Sections change color based on their state
|
||||
2. **Preserved content**: Switch between sections without losing changes
|
||||
3. **Granular controls**: Accept, cancel, or reset individual sections
|
||||
4. **Keyboard shortcuts**: Use Ctrl+Enter to accept, Escape to cancel
|
||||
|
||||
## Benefits
|
||||
|
||||
This architecture is:
|
||||
|
||||
- **Maintainable**: Clear separation of concerns
|
||||
- **Testable**: Business logic can be tested without DOM
|
||||
- **Reliable**: Proper state management prevents bugs
|
||||
- **Extensible**: Easy to add new features
|
||||
|
||||
Try editing multiple sections and see how the state is properly managed!`;
|
||||
|
||||
// Initialize the clean editor when page loads
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const container = document.getElementById('markdown-content');
|
||||
|
||||
// Create the clean editor
|
||||
const editor = new MarkitectEditor.MarkitectCleanEditor(DEMO_MARKDOWN, container, {
|
||||
theme: 'github',
|
||||
keyboardShortcuts: true,
|
||||
autosave: false
|
||||
});
|
||||
|
||||
// Add control panel
|
||||
editor.addControlPanel();
|
||||
|
||||
// Set up event handlers for demo
|
||||
editor.onDocumentChange = (status) => {
|
||||
console.log('Document changed:', status);
|
||||
};
|
||||
|
||||
editor.onSectionChange = (data) => {
|
||||
console.log('Section changed:', data.sectionId, data.section.state);
|
||||
};
|
||||
|
||||
console.log('🎯 Clean editor demo ready!');
|
||||
console.log('✓ No more content bleeding');
|
||||
console.log('✓ Reliable state management');
|
||||
console.log('✓ Test-driven development');
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
14
examples/asset-management/README.txt
Normal file
14
examples/asset-management/README.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
Asset Management Examples
|
||||
|
||||
This directory contains prototype implementations and demonstrations for asset management
|
||||
concepts developed for Issue #141:
|
||||
|
||||
- asset_management_concept_a.py: Hash-based content-addressable storage approach
|
||||
- asset_management_concept_b.py: Alternative asset management implementation
|
||||
- demo_hash_store/: Working demonstration of hash-based asset storage with metadata
|
||||
- demo_workspace/: Example workspace showing asset management in practice
|
||||
|
||||
These examples showcase different approaches to asset deduplication, storage, and
|
||||
management within the MarkiTect ecosystem.
|
||||
|
||||
--worsch, 25-10-08
|
||||
11
examples/design-patterns/README.txt
Normal file
11
examples/design-patterns/README.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Design Pattern Examples
|
||||
|
||||
This directory contains examples of software design patterns and architectural concepts:
|
||||
|
||||
- design_pattern.md: Documentation and examples of common design patterns used
|
||||
in software development, with practical implementations and use cases
|
||||
|
||||
These examples provide educational material for understanding and implementing
|
||||
design patterns in real-world projects.
|
||||
|
||||
--worsch, 25-10-03
|
||||
12
examples/essays/README.txt
Normal file
12
examples/essays/README.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Essays and Long-form Content
|
||||
|
||||
This directory contains essay examples and long-form content demonstrations:
|
||||
|
||||
- BildungsKanonJon.md: "200 Jahre Bildung" - A philosophical essay exploring 200 years
|
||||
of education from the perspective of world spirit to self-consciousness
|
||||
- BildungsKanonJon.html: Rendered HTML version of the essay
|
||||
|
||||
These examples demonstrate MarkiTect's capability to handle complex, narrative content
|
||||
with rich formatting and philosophical depth.
|
||||
|
||||
--worsch, 25-10-08
|
||||
16
examples/image-assets/README.txt
Normal file
16
examples/image-assets/README.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
Image Asset Management Examples
|
||||
|
||||
This directory contains examples demonstrating MarkiTect's image asset management
|
||||
capabilities:
|
||||
|
||||
- project_documentation.md: Sample project documentation with embedded images
|
||||
showing how MarkiTect handles image assets in markdown documents
|
||||
- images/: Directory containing sample images used in the documentation examples
|
||||
|
||||
These examples showcase:
|
||||
- Image embedding in markdown documents
|
||||
- Asset deduplication and content-addressable storage
|
||||
- Relative path handling for images in MarkiTect projects
|
||||
- Best practices for organizing image assets in documentation
|
||||
|
||||
--worsch, 25-10-29
|
||||
BIN
examples/image-assets/images/architecture_diagram.png
Normal file
BIN
examples/image-assets/images/architecture_diagram.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
BIN
examples/image-assets/images/company_logo.png
Normal file
BIN
examples/image-assets/images/company_logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
examples/image-assets/images/dashboard_screenshot.png
Normal file
BIN
examples/image-assets/images/dashboard_screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
examples/image-assets/images/performance_chart.png
Normal file
BIN
examples/image-assets/images/performance_chart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
BIN
examples/image-assets/images/project_icon.png
Normal file
BIN
examples/image-assets/images/project_icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 458 B |
BIN
examples/image-assets/images/settings_panel.png
Normal file
BIN
examples/image-assets/images/settings_panel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.7 KiB |
71
examples/image-assets/project_documentation.md
Normal file
71
examples/image-assets/project_documentation.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# Project Documentation Example
|
||||
|
||||
## Overview
|
||||
|
||||
This document demonstrates MarkiTect's image asset management capabilities by embedding various types of images commonly used in technical documentation.
|
||||
|
||||
## Architecture Diagram
|
||||
|
||||
The following diagram shows the overall system architecture:
|
||||
|
||||

|
||||
|
||||
*Figure 1: High-level system architecture showing component interactions*
|
||||
|
||||
## User Interface Screenshots
|
||||
|
||||
### Dashboard View
|
||||
|
||||
The main dashboard provides an overview of system status:
|
||||
|
||||

|
||||
|
||||
*Figure 2: Main dashboard interface with key metrics and navigation*
|
||||
|
||||
### Settings Panel
|
||||
|
||||
Users can configure system behavior through the settings panel:
|
||||
|
||||

|
||||
|
||||
*Figure 3: Configuration interface for system preferences*
|
||||
|
||||
## Logo and Branding
|
||||
|
||||
### Company Logo
|
||||
|
||||

|
||||
|
||||
### Project Icon
|
||||
|
||||
The project uses this icon throughout the interface:
|
||||
|
||||

|
||||
|
||||
## Asset Management Features
|
||||
|
||||
MarkiTect provides several key features for managing image assets:
|
||||
|
||||
1. **Content-Addressable Storage**: Images are stored using SHA-256 hashes to prevent duplication
|
||||
2. **Automatic Deduplication**: Identical images are only stored once, regardless of filename
|
||||
3. **Relative Path Resolution**: Images can be referenced using relative paths from the markdown file
|
||||
4. **Asset Tracking**: All referenced assets are tracked and validated during document processing
|
||||
|
||||
## Performance Metrics
|
||||
|
||||
The following chart shows system performance over time:
|
||||
|
||||

|
||||
|
||||
*Figure 4: System performance metrics showing response time and throughput*
|
||||
|
||||
## Conclusion
|
||||
|
||||
This example demonstrates how MarkiTect seamlessly handles multiple image assets within a single document, providing:
|
||||
|
||||
- Efficient storage through deduplication
|
||||
- Reliable asset resolution
|
||||
- Clean integration with markdown syntax
|
||||
- Support for various image formats (PNG, JPG, SVG, etc.)
|
||||
|
||||
All images in this document will be processed through MarkiTect's asset management system when the document is rendered or packaged.
|
||||
11
examples/invoicing/README.txt
Normal file
11
examples/invoicing/README.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Invoicing System Examples
|
||||
|
||||
This directory contains examples for invoice generation and template systems:
|
||||
|
||||
- invoice_template.md: Markdown template for invoice generation
|
||||
- invoice_data.json: Sample invoice data in JSON format for template population
|
||||
|
||||
These examples demonstrate how MarkiTect can be used for business document generation
|
||||
with data-driven template systems.
|
||||
|
||||
--worsch, 25-10-03
|
||||
11
examples/issue-demos/README.txt
Normal file
11
examples/issue-demos/README.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Issue Prevention Demonstrations
|
||||
|
||||
This directory contains examples demonstrating issue prevention and resolution:
|
||||
|
||||
- issue_59_prevention_demo.py: Demonstration script for preventing issues related
|
||||
to Issue #59, showing best practices and defensive programming techniques
|
||||
|
||||
These examples serve as educational material for avoiding common pitfalls and
|
||||
implementing robust solutions.
|
||||
|
||||
--worsch, 25-10-03
|
||||
11
examples/plugins/README.txt
Normal file
11
examples/plugins/README.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Plugin Development Examples
|
||||
|
||||
This directory contains example plugin implementations for MarkiTect:
|
||||
|
||||
- example_processor.py: Example of a content processor plugin
|
||||
- example_formatter.py: Example of a content formatter plugin
|
||||
|
||||
These examples show how to extend MarkiTect's functionality through the plugin
|
||||
architecture, providing templates for custom processing and formatting plugins.
|
||||
|
||||
--worsch, 25-10-03
|
||||
13
examples/templates/README.txt
Normal file
13
examples/templates/README.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Templates Collection
|
||||
|
||||
This directory contains various document templates for different standards and frameworks:
|
||||
|
||||
- TEMPLATE-ARC42.md: Software architecture documentation template following the arc42 standard
|
||||
- TEMPLATE-ISO14001.md: Environmental management system template based on ISO 14001
|
||||
- TEMPLATE-ISO27001-ISMS.md: Information security management system template for ISO 27001
|
||||
- TEMPLATE-ISO9001.md: Quality management system template following ISO 9001
|
||||
|
||||
These templates provide structured starting points for creating compliant documentation
|
||||
in their respective domains.
|
||||
|
||||
--worsch, 25-10-03
|
||||
@@ -11,7 +11,7 @@ from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
# Base version from pyproject.toml
|
||||
__version__ = "0.4.0"
|
||||
__version__ = "0.5.0"
|
||||
|
||||
def get_git_commit_hash() -> Optional[str]:
|
||||
"""Get the current git commit hash if available."""
|
||||
|
||||
@@ -223,6 +223,45 @@ class MarkdownScanner:
|
||||
return len(lines)
|
||||
|
||||
|
||||
def discover_assets_from_markdown(markdown_content: str, base_path: Path) -> List[AssetReference]:
|
||||
"""
|
||||
Simple function to discover assets from markdown content for md-render.
|
||||
|
||||
Args:
|
||||
markdown_content: The markdown content to scan
|
||||
base_path: Base path for resolving relative asset paths
|
||||
|
||||
Returns:
|
||||
List of AssetReference objects found in the markdown
|
||||
"""
|
||||
scanner = MarkdownScanner()
|
||||
|
||||
# Create a temporary file to use the existing scan_file method
|
||||
import tempfile
|
||||
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as temp_file:
|
||||
temp_file.write(markdown_content)
|
||||
temp_path = Path(temp_file.name)
|
||||
|
||||
try:
|
||||
references = scanner.scan_file(temp_path)
|
||||
# Update the source_file to the actual base_path for relative resolution
|
||||
for ref in references:
|
||||
ref.source_file = base_path
|
||||
# Resolve the asset path relative to base_path
|
||||
if not ref.asset_path.startswith(('http:', 'https:', 'mailto:', 'data:')):
|
||||
# Clean up relative path indicators
|
||||
clean_path = ref.asset_path.lstrip('./')
|
||||
resolved_path = base_path / clean_path
|
||||
if resolved_path.exists():
|
||||
ref.resolved_path = resolved_path
|
||||
else:
|
||||
ref.is_broken = True
|
||||
return references
|
||||
finally:
|
||||
# Clean up temporary file
|
||||
temp_path.unlink(missing_ok=True)
|
||||
|
||||
|
||||
class AssetDiscoveryEngine:
|
||||
"""Main engine for asset discovery and analysis."""
|
||||
|
||||
|
||||
2677
markitect/clean_document_manager.py
Normal file
2677
markitect/clean_document_manager.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -101,7 +101,7 @@ def detect_execution_mode():
|
||||
def should_use_associated_files():
|
||||
"""Determine if commands should use associated files behavior."""
|
||||
return detect_execution_mode() == 'interactive'
|
||||
from .document_manager import DocumentManager
|
||||
# DocumentManager removed - using CleanDocumentManager directly in commands
|
||||
from .serializer import ASTSerializer
|
||||
from .cache_service import CacheDirectoryService
|
||||
from .ast_service import ASTService
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,7 +16,7 @@ from typing import Dict, Any
|
||||
|
||||
from markitect.plugins.base import CommandPlugin, PluginMetadata, PluginType
|
||||
from markitect.plugins.decorators import register_plugin
|
||||
from markitect.document_manager import DocumentManager
|
||||
# DocumentManager removed - using CleanDocumentManager directly
|
||||
from markitect.serializer import ASTSerializer
|
||||
|
||||
|
||||
@@ -26,7 +26,189 @@ def get_default_format(available_formats=['table', 'json', 'yaml', 'simple'], fa
|
||||
return fallback
|
||||
|
||||
|
||||
# Template styles configuration for tests
|
||||
# Layered theme system - themes can be combined across different scopes
|
||||
LAYERED_THEMES = {
|
||||
# Mode Themes - Light/dark color schemes
|
||||
'light': {
|
||||
'scope': 'mode',
|
||||
'properties': {
|
||||
'body_background': '#ffffff',
|
||||
'body_color': '#333333',
|
||||
'heading_color': '#24292f',
|
||||
'code_background': '#f6f8fa',
|
||||
'code_color': '#24292e',
|
||||
'border_color': '#d0d7de',
|
||||
'blockquote_border': '#dfe2e5',
|
||||
'blockquote_color': '#6a737d',
|
||||
'table_border': '#d0d7de',
|
||||
'table_header_bg': '#f6f8fa',
|
||||
'link_color': '#0969da',
|
||||
'link_hover_color': '#0550ae'
|
||||
}
|
||||
},
|
||||
'dark': {
|
||||
'scope': 'mode',
|
||||
'properties': {
|
||||
'body_background': '#0d1117',
|
||||
'body_color': '#e1e4e8',
|
||||
'heading_color': '#58a6ff',
|
||||
'code_background': '#161b22',
|
||||
'code_color': '#e1e4e8',
|
||||
'border_color': '#30363d',
|
||||
'blockquote_border': '#58a6ff',
|
||||
'blockquote_color': '#8b949e',
|
||||
'table_border': '#30363d',
|
||||
'table_header_bg': '#161b22',
|
||||
'link_color': '#79c0ff',
|
||||
'link_hover_color': '#a5d6ff'
|
||||
}
|
||||
},
|
||||
|
||||
# UI Themes - Editor interface elements (floating panels, buttons, editing frames)
|
||||
'standard': {
|
||||
'scope': 'ui',
|
||||
'properties': {
|
||||
'editor_panel_bg': '#f8f9fa',
|
||||
'editor_panel_border': '#dee2e6',
|
||||
'editor_button_bg': '#ffffff',
|
||||
'editor_button_hover': '#e9ecef',
|
||||
'editor_button_active': '#dee2e6',
|
||||
'editor_text_color': '#212529',
|
||||
'editor_focus_color': '#0066cc',
|
||||
'editor_shadow': 'rgba(0,0,0,0.1)',
|
||||
'editor_danger_button': '#dc3545',
|
||||
'editor_danger_button_hover': '#c82333',
|
||||
'editor_secondary_button': '#6c757d',
|
||||
'editor_secondary_button_hover': '#545b62',
|
||||
'editor_warning_bg': '#fff3cd',
|
||||
'editor_warning_border': '#ffeaa7',
|
||||
'editor_warning_text': '#856404'
|
||||
}
|
||||
},
|
||||
'greyscale': {
|
||||
'scope': 'ui',
|
||||
'properties': {
|
||||
'editor_panel_bg': '#f5f5f5',
|
||||
'editor_panel_border': '#d0d0d0',
|
||||
'editor_button_bg': '#ffffff',
|
||||
'editor_button_hover': '#e8e8e8',
|
||||
'editor_button_active': '#d4d4d4',
|
||||
'editor_text_color': '#333333',
|
||||
'editor_focus_color': '#666666',
|
||||
'editor_shadow': 'rgba(0,0,0,0.15)',
|
||||
'editor_accept_bg': '#888888',
|
||||
'editor_accept_hover': '#777777',
|
||||
'editor_cancel_bg': '#999999',
|
||||
'editor_cancel_hover': '#808080',
|
||||
'editor_danger_button': '#8b0000',
|
||||
'editor_danger_button_hover': '#700000',
|
||||
'editor_secondary_button': '#666666',
|
||||
'editor_secondary_button_hover': '#555555',
|
||||
'editor_warning_bg': '#f0f0f0',
|
||||
'editor_warning_border': '#cccccc',
|
||||
'editor_warning_text': '#555555'
|
||||
}
|
||||
},
|
||||
'electric': {
|
||||
'scope': 'ui',
|
||||
'properties': {
|
||||
'editor_panel_bg': '#001122',
|
||||
'editor_panel_border': '#00ffff',
|
||||
'editor_button_bg': '#003366',
|
||||
'editor_button_hover': '#0066cc',
|
||||
'editor_button_active': '#0099ff',
|
||||
'editor_text_color': '#00ffff',
|
||||
'editor_focus_color': '#ffff00',
|
||||
'editor_shadow': '0 0 20px rgba(0,255,255,0.5), 0 0 40px rgba(255,255,0,0.2)',
|
||||
'editor_danger_button': '#ff3366',
|
||||
'editor_danger_button_hover': '#ff0033',
|
||||
'editor_secondary_button': '#006699',
|
||||
'editor_secondary_button_hover': '#004d73',
|
||||
'editor_warning_bg': '#003366',
|
||||
'editor_warning_border': '#00ffff',
|
||||
'editor_warning_text': '#ffff00'
|
||||
}
|
||||
},
|
||||
'psychedelic': {
|
||||
'scope': 'ui',
|
||||
'properties': {
|
||||
'editor_panel_bg': 'linear-gradient(45deg, #ff6b35, #f7931e, #ffd23f, #06ffa5)',
|
||||
'editor_panel_border': '#ff1493',
|
||||
'editor_button_bg': 'rgba(255,255,255,0.2)',
|
||||
'editor_button_hover': 'rgba(255,20,147,0.3)',
|
||||
'editor_button_active': 'rgba(255,20,147,0.5)',
|
||||
'editor_text_color': '#ffffff',
|
||||
'editor_focus_color': '#ff1493',
|
||||
'editor_shadow': 'rgba(255,20,147,0.4)',
|
||||
'editor_danger_button': 'linear-gradient(45deg, #ff0066, #cc0044)',
|
||||
'editor_danger_button_hover': 'linear-gradient(45deg, #ff3388, #dd1155)',
|
||||
'editor_secondary_button': 'linear-gradient(45deg, #8a2be2, #4b0082)',
|
||||
'editor_secondary_button_hover': 'linear-gradient(45deg, #9932cc, #6a1a9a)',
|
||||
'editor_warning_bg': 'linear-gradient(45deg, #ffa500, #ff8c00)',
|
||||
'editor_warning_border': '#ff1493',
|
||||
'editor_warning_text': '#ffffff'
|
||||
}
|
||||
},
|
||||
|
||||
# Document Themes - Typography and layout
|
||||
'basic': {
|
||||
'scope': 'document',
|
||||
'properties': {
|
||||
'font_family': '-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif',
|
||||
'max_width': '800px',
|
||||
'heading_style': 'simple',
|
||||
'text_align': 'left'
|
||||
}
|
||||
},
|
||||
'github': {
|
||||
'scope': 'document',
|
||||
'properties': {
|
||||
'font_family': '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif',
|
||||
'max_width': '900px',
|
||||
'heading_style': 'underlined',
|
||||
'text_align': 'left'
|
||||
}
|
||||
},
|
||||
'academic': {
|
||||
'scope': 'document',
|
||||
'properties': {
|
||||
'font_family': 'Georgia, Times New Roman, serif',
|
||||
'max_width': '650px',
|
||||
'heading_style': 'centered',
|
||||
'text_align': 'justify',
|
||||
'link_color': '#777777',
|
||||
'link_hover_color': '#999999'
|
||||
}
|
||||
},
|
||||
|
||||
# Branding Themes - Company/personal styling
|
||||
'corporate': {
|
||||
'scope': 'branding',
|
||||
'properties': {
|
||||
'accent_color': '#0066cc',
|
||||
'secondary_color': '#f8f9fa',
|
||||
'brand_font': 'inherit'
|
||||
}
|
||||
},
|
||||
'startup': {
|
||||
'scope': 'branding',
|
||||
'properties': {
|
||||
'accent_color': '#ff6b35',
|
||||
'secondary_color': '#f4f4f4',
|
||||
'brand_font': 'inherit'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Legacy compatibility - map old theme names to new layered equivalents
|
||||
LEGACY_THEME_MAPPING = {
|
||||
'basic': ['light', 'standard', 'basic'],
|
||||
'github': ['light', 'standard', 'github'],
|
||||
'dark': ['dark', 'standard', 'basic'],
|
||||
'academic': ['light', 'standard', 'academic']
|
||||
}
|
||||
|
||||
# Keep TEMPLATE_STYLES for backward compatibility in tests
|
||||
TEMPLATE_STYLES = {
|
||||
'basic': {
|
||||
'body_color': '#333',
|
||||
@@ -51,21 +233,133 @@ TEMPLATE_STYLES = {
|
||||
}
|
||||
|
||||
|
||||
def generate_html_with_embedded_markdown(markdown_content, title, template, css_content, template_vars):
|
||||
def parse_theme_string(theme_string: str) -> list:
|
||||
"""
|
||||
Parse theme string into list of individual themes.
|
||||
|
||||
Supports:
|
||||
- Single theme: "dark"
|
||||
- Multiple themes: "dark,academic" or "dark, academic"
|
||||
- Legacy theme mapping: "basic" -> ["light", "basic"]
|
||||
|
||||
Args:
|
||||
theme_string: Comma-separated theme names
|
||||
|
||||
Returns:
|
||||
List of theme names in order
|
||||
"""
|
||||
if not theme_string:
|
||||
return ['light', 'basic'] # Default themes
|
||||
|
||||
# Split by comma and clean up whitespace
|
||||
themes = [theme.strip() for theme in theme_string.split(',')]
|
||||
|
||||
# Expand legacy themes only if they don't exist in the new layered system
|
||||
expanded_themes = []
|
||||
for theme in themes:
|
||||
if theme in LAYERED_THEMES:
|
||||
# Theme exists in new system, use as-is
|
||||
expanded_themes.append(theme)
|
||||
elif theme in LEGACY_THEME_MAPPING:
|
||||
# Legacy theme, expand it
|
||||
expanded_themes.extend(LEGACY_THEME_MAPPING[theme])
|
||||
else:
|
||||
# Unknown theme, add as-is (will be warned about later)
|
||||
expanded_themes.append(theme)
|
||||
|
||||
return expanded_themes
|
||||
|
||||
|
||||
class ThemeType(click.ParamType):
|
||||
"""Custom click type for theme validation."""
|
||||
|
||||
name = "theme"
|
||||
|
||||
def convert(self, value, param, ctx):
|
||||
if value is None:
|
||||
return value
|
||||
|
||||
try:
|
||||
validate_theme_string(value)
|
||||
return value
|
||||
except click.BadParameter as e:
|
||||
self.fail(str(e), param, ctx)
|
||||
|
||||
|
||||
def validate_theme_string(theme_string: str) -> None:
|
||||
"""
|
||||
Validate that all themes in a theme string are known themes.
|
||||
|
||||
Args:
|
||||
theme_string: Comma-separated theme names
|
||||
|
||||
Raises:
|
||||
click.BadParameter: If any theme is unknown
|
||||
"""
|
||||
if not theme_string:
|
||||
return # Allow empty/None themes
|
||||
|
||||
themes = parse_theme_string(theme_string)
|
||||
unknown_themes = []
|
||||
|
||||
for theme_name in themes:
|
||||
if theme_name not in LAYERED_THEMES and theme_name not in LEGACY_THEME_MAPPING:
|
||||
unknown_themes.append(theme_name)
|
||||
|
||||
if unknown_themes:
|
||||
available_themes = list(LAYERED_THEMES.keys()) + list(LEGACY_THEME_MAPPING.keys())
|
||||
raise click.BadParameter(
|
||||
f"Unknown theme(s): {', '.join(unknown_themes)}. "
|
||||
f"Available themes: {', '.join(sorted(set(available_themes)))}"
|
||||
)
|
||||
|
||||
|
||||
def combine_theme_properties(theme_list: list) -> dict:
|
||||
"""
|
||||
Combine properties from multiple themes, with later themes overriding earlier ones.
|
||||
|
||||
Args:
|
||||
theme_list: List of theme names in order of application
|
||||
|
||||
Returns:
|
||||
Combined properties dictionary
|
||||
"""
|
||||
combined_properties = {}
|
||||
|
||||
for theme_name in theme_list:
|
||||
if theme_name in LAYERED_THEMES:
|
||||
theme_data = LAYERED_THEMES[theme_name]
|
||||
# Later themes override earlier ones
|
||||
combined_properties.update(theme_data['properties'])
|
||||
elif theme_name in LEGACY_THEME_MAPPING:
|
||||
# Handle legacy themes by expanding them
|
||||
expanded_themes = LEGACY_THEME_MAPPING[theme_name]
|
||||
for expanded_theme in expanded_themes:
|
||||
if expanded_theme in LAYERED_THEMES:
|
||||
theme_data = LAYERED_THEMES[expanded_theme]
|
||||
combined_properties.update(theme_data['properties'])
|
||||
else:
|
||||
# This should not happen if validation is working
|
||||
print(f"Warning: Unknown theme '{theme_name}' - skipping")
|
||||
return combined_properties
|
||||
|
||||
|
||||
def generate_html_with_embedded_markdown(markdown_content, title, theme, css_content, template_vars):
|
||||
"""
|
||||
Generate HTML with embedded markdown content for testing.
|
||||
|
||||
This function is used by tests to validate template functionality.
|
||||
"""
|
||||
# Create a temporary document manager for rendering
|
||||
doc_manager = DocumentManager(None)
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(None)
|
||||
|
||||
# Generate HTML template
|
||||
html_content = doc_manager._generate_html_template(
|
||||
markdown_content=markdown_content,
|
||||
title=title,
|
||||
css=css_content,
|
||||
template=template
|
||||
template=theme
|
||||
)
|
||||
|
||||
return html_content
|
||||
@@ -191,7 +485,8 @@ def process_single_file(input_file: Path, use_publication_dir: bool, publication
|
||||
output_file = input_file.with_suffix('.html')
|
||||
|
||||
# Create document manager and render
|
||||
doc_manager = DocumentManager(None)
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(None)
|
||||
doc_manager.render_file(str(input_file), str(output_file))
|
||||
|
||||
return output_file
|
||||
@@ -212,7 +507,8 @@ def process_directory(input_dir: Path, use_publication_dir: bool, publication_di
|
||||
markdown_files = find_markdown_files(input_dir)
|
||||
output_files = []
|
||||
|
||||
doc_manager = DocumentManager(None)
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(None)
|
||||
|
||||
for md_file in markdown_files:
|
||||
if use_publication_dir:
|
||||
@@ -304,21 +600,22 @@ def extract_html_title(html_file: Path) -> str:
|
||||
return html_file.stem
|
||||
|
||||
|
||||
def generate_index_html(html_files: list, title: str, template: str = None) -> str:
|
||||
def generate_index_html(html_files: list, title: str, theme: str = None) -> str:
|
||||
"""
|
||||
Generate HTML content for an index page.
|
||||
|
||||
Args:
|
||||
html_files: List of dictionaries with 'path', 'title', and 'relative_path' keys
|
||||
title: Title for the index page
|
||||
template: Template theme to use
|
||||
theme: Theme to use
|
||||
|
||||
Returns:
|
||||
HTML content string
|
||||
"""
|
||||
# Get template CSS
|
||||
doc_manager = DocumentManager(None)
|
||||
template_css = doc_manager._get_template_css(template)
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(None)
|
||||
template_css = doc_manager._get_template_css(theme)
|
||||
|
||||
# Generate file list HTML
|
||||
if not html_files:
|
||||
@@ -1497,6 +1794,7 @@ class MarkdownCommandsPlugin(CommandPlugin):
|
||||
'md-get': md_get_command,
|
||||
'md-list': md_list_command,
|
||||
'md-render': md_render_command,
|
||||
'themes': themes_list_command,
|
||||
'md-index': md_index_command,
|
||||
'md-explode': md_explode_command,
|
||||
'md-implode': md_implode_command,
|
||||
@@ -1530,7 +1828,8 @@ def md_ingest_command(ctx, file_path):
|
||||
click.echo(f"Processing file: {file_path}")
|
||||
|
||||
# Initialize document manager with database manager
|
||||
doc_manager = DocumentManager(config.get('db_manager'))
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(config.get('db_manager'))
|
||||
|
||||
# Process the file
|
||||
result = doc_manager.ingest_file(Path(file_path))
|
||||
@@ -1571,7 +1870,8 @@ def md_get_command(ctx, file_path, output):
|
||||
config = ctx.obj or {}
|
||||
try:
|
||||
# Initialize document manager
|
||||
doc_manager = DocumentManager(config.get('db_manager'))
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(config.get('db_manager'))
|
||||
|
||||
# Get file information
|
||||
result = doc_manager.get_file(file_path)
|
||||
@@ -1620,7 +1920,8 @@ def md_list_command(ctx, output_format, names_only):
|
||||
config = ctx.obj or {}
|
||||
try:
|
||||
# Initialize document manager
|
||||
doc_manager = DocumentManager(config.get('db_manager'))
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(config.get('db_manager'))
|
||||
|
||||
# Get file listing
|
||||
files = doc_manager.list_files()
|
||||
@@ -1654,12 +1955,14 @@ def md_list_command(ctx, output_format, names_only):
|
||||
@click.argument('input_file', type=click.Path(exists=True))
|
||||
@click.option('--output', '-o', type=click.Path(),
|
||||
help='Output HTML file (default: <input>.html)')
|
||||
@click.option('--template', type=click.Choice(['basic', 'github', 'dark', 'academic']),
|
||||
help='Built-in template theme (basic, github, dark, academic)')
|
||||
@click.option('--theme', type=ThemeType(),
|
||||
help='Theme(s) to apply. Single: dark or layered: dark,academic or light,github,corporate. Available: basic, github, dark, academic, light, corporate, startup')
|
||||
@click.option('--css', type=click.Path(),
|
||||
help='Custom CSS file to include')
|
||||
@click.option('--edit', is_flag=True,
|
||||
help='Open in live edit mode with preview')
|
||||
help='Open in interactive edit mode with stable section editing')
|
||||
@click.option('--insert', is_flag=True,
|
||||
help='Open in interactive insert mode with heading protection (levels 1-3 read-only)')
|
||||
@click.option('--editor-theme', default='github',
|
||||
type=click.Choice(['github', 'monokai', 'tomorrow', 'dark']),
|
||||
help='Editor theme for live edit mode (default: github)')
|
||||
@@ -1669,66 +1972,152 @@ def md_list_command(ctx, output_format, names_only):
|
||||
help='Use publication directory for output')
|
||||
@click.option('--dont-use-publication-dir', is_flag=True,
|
||||
help='Don\'t use publication directory for output')
|
||||
@click.option('--nodogtag', is_flag=True,
|
||||
help='Don\'t add HTML generation dogtag at end of document')
|
||||
@click.option('--ship-assets', is_flag=True, default=None,
|
||||
help='Copy referenced assets to output directory')
|
||||
@click.option('--no-ship-assets', is_flag=True,
|
||||
help='Don\'t copy referenced assets to output directory')
|
||||
@click.pass_context
|
||||
def md_render_command(ctx, input_file, output, template, css, edit, editor_theme,
|
||||
keyboard_shortcuts, use_publication_dir, dont_use_publication_dir):
|
||||
def md_render_command(ctx, input_file, output, theme, css, edit, insert, editor_theme,
|
||||
keyboard_shortcuts, use_publication_dir, dont_use_publication_dir, nodogtag,
|
||||
ship_assets, no_ship_assets):
|
||||
"""
|
||||
Render a markdown file to HTML with basic templates and live preview capabilities.
|
||||
|
||||
Converts a markdown file to HTML using customizable templates and styles.
|
||||
Converts a markdown file to HTML using customizable layered themes and styles.
|
||||
Supports live editing mode with real-time preview and syntax highlighting.
|
||||
Choose from basic, github, dark, or academic themes for professional output.
|
||||
|
||||
Theme Layering:
|
||||
- Single themes: basic, github, dark, academic, light, corporate, startup
|
||||
- Layered themes: dark,academic combines dark UI with academic typography
|
||||
- Later themes override settings from earlier themes
|
||||
|
||||
INPUT_FILE: Path to the markdown file to render
|
||||
|
||||
Examples:
|
||||
markitect md-render README.md
|
||||
markitect md-render docs/guide.md --output guide.html --template github
|
||||
markitect md-render docs/guide.md --output guide.html --theme github
|
||||
markitect md-render draft.md --edit --editor-theme monokai
|
||||
markitect md-render doc.md --template dark --css custom.css
|
||||
markitect md-render draft.md --insert --editor-theme monokai
|
||||
markitect md-render doc.md --theme dark --css custom.css
|
||||
markitect md-render doc.md --theme dark,academic
|
||||
markitect md-render doc.md --theme light,github,corporate
|
||||
"""
|
||||
config = ctx.obj or {}
|
||||
|
||||
try:
|
||||
input_path = Path(input_file)
|
||||
|
||||
# Determine output path
|
||||
# Validate mode flags
|
||||
if edit and insert:
|
||||
raise click.BadParameter("Cannot use both --edit and --insert flags simultaneously. Choose one mode.")
|
||||
|
||||
# Validate asset shipping flags
|
||||
if ship_assets and no_ship_assets:
|
||||
raise click.BadParameter("Cannot use both --ship-assets and --no-ship-assets flags simultaneously.")
|
||||
|
||||
# Determine output path with environment variable support
|
||||
if output:
|
||||
output_path = Path(output)
|
||||
# If output is a directory, use canonical filename within that directory
|
||||
if output_path.is_dir() or (not output_path.suffix and not output_path.exists()):
|
||||
# Ensure the directory exists
|
||||
output_path.mkdir(parents=True, exist_ok=True)
|
||||
# Use canonical filename (input name + .html) in the specified directory
|
||||
canonical_filename = input_path.with_suffix('.html').name
|
||||
output_path = output_path / canonical_filename
|
||||
output_is_directory = True
|
||||
else:
|
||||
output_is_directory = False
|
||||
else:
|
||||
output_path = input_path.with_suffix('.html')
|
||||
# Check for environment variable
|
||||
import os
|
||||
env_output_dir = os.environ.get('MARKITECT_OUTPUT_DIR')
|
||||
if env_output_dir:
|
||||
output_path = Path(env_output_dir)
|
||||
output_path.mkdir(parents=True, exist_ok=True)
|
||||
canonical_filename = input_path.with_suffix('.html').name
|
||||
output_path = output_path / canonical_filename
|
||||
output_is_directory = True
|
||||
else:
|
||||
output_path = input_path.with_suffix('.html')
|
||||
output_is_directory = False
|
||||
|
||||
# Use publication directory if specified
|
||||
if use_publication_dir and not dont_use_publication_dir:
|
||||
pub_dir = get_publication_directory()
|
||||
ensure_publication_directory(pub_dir)
|
||||
output_path = pub_dir / get_output_filename(input_path)
|
||||
output_is_directory = True # Publication dir is always a directory output
|
||||
|
||||
# Initialize document manager
|
||||
doc_manager = DocumentManager(config.get('db_manager'))
|
||||
# Determine if we should ship assets
|
||||
should_ship_assets = False
|
||||
if no_ship_assets:
|
||||
should_ship_assets = False
|
||||
elif ship_assets:
|
||||
should_ship_assets = True
|
||||
elif output_is_directory:
|
||||
# Default: ship assets when output is a directory
|
||||
should_ship_assets = True
|
||||
|
||||
|
||||
# Discover and ship assets if needed
|
||||
if should_ship_assets:
|
||||
if output_is_directory:
|
||||
# For directory output, ship to the same directory as the HTML file
|
||||
_ship_assets(input_path, output_path.parent, config.get('verbose', False))
|
||||
# For file output, we don't ship assets (shouldn't reach here anyway)
|
||||
|
||||
# Initialize clean document manager
|
||||
from markitect.clean_document_manager import CleanDocumentManager
|
||||
doc_manager = CleanDocumentManager(config.get('db_manager'))
|
||||
|
||||
# Render the file
|
||||
if edit:
|
||||
# Live edit mode - generate HTML with editing capabilities
|
||||
# Edit mode - generate HTML with editing capabilities
|
||||
result = doc_manager.render_file(input_file, str(output_path),
|
||||
template=template, css=css,
|
||||
edit_mode=True, editor_theme=editor_theme,
|
||||
keyboard_shortcuts=keyboard_shortcuts)
|
||||
click.echo(f"✓ Rendered with editing capabilities to: {output_path}")
|
||||
template=theme, css=css,
|
||||
edit_mode=True,
|
||||
editor_theme=editor_theme,
|
||||
keyboard_shortcuts=keyboard_shortcuts,
|
||||
nodogtag=nodogtag)
|
||||
|
||||
click.echo(f"✓ Rendered with interactive editing capabilities to: {output_path}")
|
||||
|
||||
if config.get('verbose', False):
|
||||
click.echo(f"Editor theme: {editor_theme}")
|
||||
click.echo(f"Keyboard shortcuts: {'enabled' if keyboard_shortcuts else 'disabled'}")
|
||||
click.echo(f"Template: {template or 'default'}")
|
||||
click.echo(f"Theme: {theme or 'default'}")
|
||||
click.echo(f"CSS: {css or 'default'}")
|
||||
elif insert:
|
||||
# Insert mode - generate HTML with insert capabilities and heading protection
|
||||
result = doc_manager.render_file(input_file, str(output_path),
|
||||
template=theme, css=css,
|
||||
insert_mode=True,
|
||||
editor_theme=editor_theme,
|
||||
keyboard_shortcuts=keyboard_shortcuts,
|
||||
nodogtag=nodogtag)
|
||||
|
||||
click.echo(f"✓ Rendered with interactive insert capabilities to: {output_path}")
|
||||
|
||||
if config.get('verbose', False):
|
||||
click.echo(f"Editor theme: {editor_theme}")
|
||||
click.echo(f"Keyboard shortcuts: {'enabled' if keyboard_shortcuts else 'disabled'}")
|
||||
click.echo(f"Heading protection: levels 1-3 read-only")
|
||||
click.echo(f"Theme: {theme or 'default'}")
|
||||
click.echo(f"CSS: {css or 'default'}")
|
||||
else:
|
||||
# Static render
|
||||
result = doc_manager.render_file(input_file, str(output_path),
|
||||
template=template, css=css)
|
||||
template=theme, css=css,
|
||||
edit_mode=False,
|
||||
insert_mode=False,
|
||||
nodogtag=nodogtag)
|
||||
click.echo(f"✓ Rendered to: {output_path}")
|
||||
|
||||
if config.get('verbose', False):
|
||||
click.echo(f"Template: {template or 'default'}")
|
||||
click.echo(f"Theme: {theme or 'default'}")
|
||||
click.echo(f"CSS: {css or 'default'}")
|
||||
|
||||
except Exception as e:
|
||||
@@ -1736,16 +2125,126 @@ def md_render_command(ctx, input_file, output, template, css, edit, editor_theme
|
||||
raise click.Abort()
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.option('--format', type=click.Choice(['table', 'list', 'json']), default='table',
|
||||
help='Output format: table (default), list, or json')
|
||||
@click.option('--scope', type=click.Choice(['mode', 'ui', 'document', 'branding', 'all']), default='all',
|
||||
help='Filter themes by scope: mode (light/dark), ui (editor interface), document (typography), branding (colors), or all (default)')
|
||||
def themes_list_command(format, scope):
|
||||
"""
|
||||
List all available themes and their properties.
|
||||
|
||||
Shows the available themes that can be used with md-render and other commands.
|
||||
Themes can be used individually or combined in layers.
|
||||
|
||||
Examples:
|
||||
markitect themes list
|
||||
markitect themes list --format json
|
||||
markitect themes list --scope ui
|
||||
markitect themes list --scope document --format list
|
||||
"""
|
||||
from tabulate import tabulate
|
||||
import json
|
||||
|
||||
# Get theme data
|
||||
layered_themes = []
|
||||
legacy_mappings = []
|
||||
|
||||
# Process layered themes
|
||||
for theme_name, theme_data in LAYERED_THEMES.items():
|
||||
theme_scope = theme_data['scope']
|
||||
if scope == 'all' or scope == theme_scope:
|
||||
properties = theme_data['properties']
|
||||
# Get key properties for display based on scope
|
||||
key_props = []
|
||||
if theme_scope == 'mode':
|
||||
if 'body_background' in properties:
|
||||
key_props.append(f"bg:{properties['body_background']}")
|
||||
if 'link_color' in properties:
|
||||
key_props.append(f"links:{properties['link_color']}")
|
||||
elif theme_scope == 'ui':
|
||||
if 'editor_panel_bg' in properties:
|
||||
key_props.append(f"panel:{properties['editor_panel_bg']}")
|
||||
if 'editor_text_color' in properties:
|
||||
key_props.append(f"text:{properties['editor_text_color']}")
|
||||
if 'editor_focus_color' in properties:
|
||||
key_props.append(f"focus:{properties['editor_focus_color']}")
|
||||
elif theme_scope == 'document':
|
||||
if 'font_family' in properties:
|
||||
family = properties['font_family'].split(',')[0].strip().strip('"\'')
|
||||
key_props.append(f"font:{family}")
|
||||
if 'link_color' in properties:
|
||||
key_props.append(f"links:{properties['link_color']}")
|
||||
elif theme_scope == 'branding':
|
||||
if 'accent_color' in properties:
|
||||
key_props.append(f"accent:{properties['accent_color']}")
|
||||
|
||||
layered_themes.append({
|
||||
'name': theme_name,
|
||||
'scope': theme_scope,
|
||||
'properties': ', '.join(key_props) if key_props else 'default styling'
|
||||
})
|
||||
|
||||
# Process legacy mappings
|
||||
for legacy_name, expanded_themes in LEGACY_THEME_MAPPING.items():
|
||||
legacy_mappings.append({
|
||||
'name': legacy_name,
|
||||
'expands_to': ' + '.join(expanded_themes)
|
||||
})
|
||||
|
||||
if format == 'json':
|
||||
# JSON output
|
||||
output_data = {
|
||||
'layered_themes': layered_themes,
|
||||
'legacy_mappings': legacy_mappings,
|
||||
'usage': {
|
||||
'single': 'markitect md-render file.md --theme dark',
|
||||
'layered': 'markitect md-render file.md --theme dark,academic',
|
||||
'legacy': 'markitect md-render file.md --theme github'
|
||||
}
|
||||
}
|
||||
click.echo(json.dumps(output_data, indent=2))
|
||||
|
||||
elif format == 'list':
|
||||
# Simple list output
|
||||
click.echo("Available themes:")
|
||||
for theme in layered_themes:
|
||||
click.echo(f" {theme['name']} ({theme['scope']})")
|
||||
if legacy_mappings:
|
||||
click.echo("\nLegacy mappings:")
|
||||
for mapping in legacy_mappings:
|
||||
click.echo(f" {mapping['name']} -> {mapping['expands_to']}")
|
||||
|
||||
else: # table format (default)
|
||||
# Table output
|
||||
if layered_themes:
|
||||
click.echo("Layered themes (can be combined):")
|
||||
headers = ['Theme', 'Scope', 'Key Properties']
|
||||
table_data = [[t['name'], t['scope'], t['properties']] for t in layered_themes]
|
||||
click.echo(tabulate(table_data, headers=headers, tablefmt='grid'))
|
||||
|
||||
if legacy_mappings:
|
||||
click.echo("\nLegacy theme mappings:")
|
||||
headers = ['Legacy Name', 'Expands To']
|
||||
table_data = [[m['name'], m['expands_to']] for m in legacy_mappings]
|
||||
click.echo(tabulate(table_data, headers=headers, tablefmt='grid'))
|
||||
|
||||
click.echo("\nUsage examples:")
|
||||
click.echo(" Single theme: markitect md-render file.md --theme dark")
|
||||
click.echo(" Layered themes: markitect md-render file.md --theme dark,academic")
|
||||
click.echo(" Legacy mapping: markitect md-render file.md --theme github")
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument('directory', type=click.Path(exists=True, file_okay=False, dir_okay=True))
|
||||
@click.option('--output', '-o', type=click.Path(),
|
||||
help='Output index file (default: <directory>/index.html)')
|
||||
@click.option('--template', type=click.Choice(['basic', 'github', 'dark', 'academic']),
|
||||
help='Built-in template theme for index')
|
||||
@click.option('--theme', type=ThemeType(),
|
||||
help='Theme(s) to apply to index. Single: dark or layered: dark,github. Available: basic, github, dark, academic, light, corporate, startup')
|
||||
@click.option('--recursive', '-r', is_flag=True,
|
||||
help='Include subdirectories recursively')
|
||||
@click.pass_context
|
||||
def md_index_command(ctx, directory, output, template, recursive):
|
||||
def md_index_command(ctx, directory, output, theme, recursive):
|
||||
"""
|
||||
Generate an index page for HTML files in a directory.
|
||||
|
||||
@@ -1797,7 +2296,7 @@ def md_index_command(ctx, directory, output, template, recursive):
|
||||
index_title = f"Index - {dir_path.name}"
|
||||
|
||||
# Generate HTML content
|
||||
html_content = generate_index_html(file_info_list, index_title, template)
|
||||
html_content = generate_index_html(file_info_list, index_title, theme)
|
||||
|
||||
# Write index file
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
@@ -2983,3 +3482,76 @@ class FilenameDecoder:
|
||||
return [self.decode(filename) for filename in filenames]
|
||||
|
||||
|
||||
def _ship_assets(input_path: Path, output_dir: Path, verbose: bool = False):
|
||||
"""
|
||||
Ship (copy) assets referenced in markdown file to output directory.
|
||||
|
||||
Args:
|
||||
input_path: Path to the markdown file
|
||||
output_dir: Directory where assets should be copied
|
||||
verbose: Whether to print verbose output
|
||||
"""
|
||||
import shutil
|
||||
from markitect.assets.discovery import discover_assets_from_markdown
|
||||
|
||||
try:
|
||||
# Read the markdown content
|
||||
markdown_content = input_path.read_text(encoding='utf-8')
|
||||
|
||||
# Discover assets
|
||||
base_path = input_path.parent
|
||||
assets = discover_assets_from_markdown(markdown_content, base_path)
|
||||
|
||||
shipped_count = 0
|
||||
skipped_count = 0
|
||||
missing_count = 0
|
||||
|
||||
for asset_ref in assets:
|
||||
# Skip URLs and broken assets
|
||||
if asset_ref.asset_path.startswith(('http:', 'https:', 'mailto:', 'data:')):
|
||||
continue
|
||||
|
||||
if asset_ref.is_broken or not asset_ref.resolved_path:
|
||||
missing_count += 1
|
||||
if verbose:
|
||||
click.echo(f" ⚠ Missing asset: {asset_ref.asset_path}", err=True)
|
||||
continue
|
||||
|
||||
# Determine output path (preserve relative directory structure)
|
||||
clean_path = asset_ref.asset_path.lstrip('./')
|
||||
dest_path = output_dir / clean_path
|
||||
|
||||
# Create destination directory
|
||||
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Check if we need to copy (timestamp-based)
|
||||
should_copy = True
|
||||
if dest_path.exists():
|
||||
source_mtime = asset_ref.resolved_path.stat().st_mtime
|
||||
dest_mtime = dest_path.stat().st_mtime
|
||||
if source_mtime <= dest_mtime:
|
||||
should_copy = False
|
||||
skipped_count += 1
|
||||
|
||||
if should_copy:
|
||||
shutil.copy2(asset_ref.resolved_path, dest_path)
|
||||
shipped_count += 1
|
||||
if verbose:
|
||||
click.echo(f" ✓ Copied: {asset_ref.asset_path}")
|
||||
elif verbose:
|
||||
click.echo(f" → Skipped (up-to-date): {asset_ref.asset_path}")
|
||||
|
||||
# Summary
|
||||
if verbose or shipped_count > 0:
|
||||
if shipped_count > 0:
|
||||
click.echo(f"✓ Shipped {shipped_count} assets")
|
||||
if skipped_count > 0:
|
||||
click.echo(f" → Skipped {skipped_count} up-to-date assets")
|
||||
if missing_count > 0:
|
||||
click.echo(f" ⚠ {missing_count} assets not found", err=True)
|
||||
|
||||
except Exception as e:
|
||||
if verbose:
|
||||
click.echo(f"Error shipping assets: {e}", err=True)
|
||||
|
||||
|
||||
|
||||
4385
markitect/static/editor.js
Normal file
4385
markitect/static/editor.js
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/.bin/baseline-browser-mapping
generated
vendored
Symbolic link
1
node_modules/.bin/baseline-browser-mapping
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../baseline-browser-mapping/dist/cli.js
|
||||
1
node_modules/.bin/browserslist
generated
vendored
Symbolic link
1
node_modules/.bin/browserslist
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../browserslist/cli.js
|
||||
1
node_modules/.bin/esparse
generated
vendored
Symbolic link
1
node_modules/.bin/esparse
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../esprima/bin/esparse.js
|
||||
1
node_modules/.bin/esvalidate
generated
vendored
Symbolic link
1
node_modules/.bin/esvalidate
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../esprima/bin/esvalidate.js
|
||||
1
node_modules/.bin/glob
generated
vendored
Symbolic link
1
node_modules/.bin/glob
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../glob/dist/esm/bin.mjs
|
||||
1
node_modules/.bin/import-local-fixture
generated
vendored
Symbolic link
1
node_modules/.bin/import-local-fixture
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../import-local/fixtures/cli.js
|
||||
1
node_modules/.bin/jest
generated
vendored
Symbolic link
1
node_modules/.bin/jest
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../jest/bin/jest.js
|
||||
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
1
node_modules/.bin/js-yaml
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../js-yaml/bin/js-yaml.js
|
||||
1
node_modules/.bin/jsesc
generated
vendored
Symbolic link
1
node_modules/.bin/jsesc
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../jsesc/bin/jsesc
|
||||
1
node_modules/.bin/json5
generated
vendored
Symbolic link
1
node_modules/.bin/json5
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../json5/lib/cli.js
|
||||
1
node_modules/.bin/napi-postinstall
generated
vendored
Symbolic link
1
node_modules/.bin/napi-postinstall
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../napi-postinstall/lib/cli.js
|
||||
1
node_modules/.bin/node-which
generated
vendored
Symbolic link
1
node_modules/.bin/node-which
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../which/bin/node-which
|
||||
1
node_modules/.bin/parser
generated
vendored
Symbolic link
1
node_modules/.bin/parser
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../@babel/parser/bin/babel-parser.js
|
||||
1
node_modules/.bin/semver
generated
vendored
Symbolic link
1
node_modules/.bin/semver
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../semver/bin/semver.js
|
||||
1
node_modules/.bin/update-browserslist-db
generated
vendored
Symbolic link
1
node_modules/.bin/update-browserslist-db
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../update-browserslist-db/cli.js
|
||||
4066
node_modules/.package-lock.json
generated
vendored
Normal file
4066
node_modules/.package-lock.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
22
node_modules/@babel/code-frame/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
19
node_modules/@babel/code-frame/README.md
generated
vendored
Normal file
19
node_modules/@babel/code-frame/README.md
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# @babel/code-frame
|
||||
|
||||
> Generate errors that contain a code frame that point to source locations.
|
||||
|
||||
See our website [@babel/code-frame](https://babeljs.io/docs/babel-code-frame) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save-dev @babel/code-frame
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/code-frame --dev
|
||||
```
|
||||
31
node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
31
node_modules/@babel/code-frame/package.json
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "@babel/code-frame",
|
||||
"version": "7.27.1",
|
||||
"description": "Generate errors that contain a code frame that point to source locations.",
|
||||
"author": "The Babel Team (https://babel.dev/team)",
|
||||
"homepage": "https://babel.dev/docs/en/next/babel-code-frame",
|
||||
"bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen",
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-code-frame"
|
||||
},
|
||||
"main": "./lib/index.js",
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"js-tokens": "^4.0.0",
|
||||
"picocolors": "^1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"import-meta-resolve": "^4.1.0",
|
||||
"strip-ansi": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"type": "commonjs"
|
||||
}
|
||||
22
node_modules/@babel/compat-data/LICENSE
generated
vendored
Normal file
22
node_modules/@babel/compat-data/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
19
node_modules/@babel/compat-data/README.md
generated
vendored
Normal file
19
node_modules/@babel/compat-data/README.md
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# @babel/compat-data
|
||||
|
||||
> The compat-data to determine required Babel plugins
|
||||
|
||||
See our website [@babel/compat-data](https://babeljs.io/docs/babel-compat-data) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save @babel/compat-data
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/compat-data
|
||||
```
|
||||
2
node_modules/@babel/compat-data/corejs2-built-ins.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/corejs2-built-ins.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file as Babel 8 drop support of core-js 2
|
||||
module.exports = require("./data/corejs2-built-ins.json");
|
||||
2
node_modules/@babel/compat-data/corejs3-shipped-proposals.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/corejs3-shipped-proposals.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file now that it is included in babel-plugin-polyfill-corejs3
|
||||
module.exports = require("./data/corejs3-shipped-proposals.json");
|
||||
2106
node_modules/@babel/compat-data/data/corejs2-built-ins.json
generated
vendored
Normal file
2106
node_modules/@babel/compat-data/data/corejs2-built-ins.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5
node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json
generated
vendored
Normal file
5
node_modules/@babel/compat-data/data/corejs3-shipped-proposals.json
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
[
|
||||
"esnext.promise.all-settled",
|
||||
"esnext.string.match-all",
|
||||
"esnext.global-this"
|
||||
]
|
||||
18
node_modules/@babel/compat-data/data/native-modules.json
generated
vendored
Normal file
18
node_modules/@babel/compat-data/data/native-modules.json
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"es6.module": {
|
||||
"chrome": "61",
|
||||
"and_chr": "61",
|
||||
"edge": "16",
|
||||
"firefox": "60",
|
||||
"and_ff": "60",
|
||||
"node": "13.2.0",
|
||||
"opera": "48",
|
||||
"op_mob": "45",
|
||||
"safari": "10.1",
|
||||
"ios": "10.3",
|
||||
"samsung": "8.2",
|
||||
"android": "61",
|
||||
"electron": "2.0",
|
||||
"ios_saf": "10.3"
|
||||
}
|
||||
}
|
||||
35
node_modules/@babel/compat-data/data/overlapping-plugins.json
generated
vendored
Normal file
35
node_modules/@babel/compat-data/data/overlapping-plugins.json
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"transform-async-to-generator": [
|
||||
"bugfix/transform-async-arrows-in-class"
|
||||
],
|
||||
"transform-parameters": [
|
||||
"bugfix/transform-edge-default-parameters",
|
||||
"bugfix/transform-safari-id-destructuring-collision-in-function-expression"
|
||||
],
|
||||
"transform-function-name": [
|
||||
"bugfix/transform-edge-function-name"
|
||||
],
|
||||
"transform-block-scoping": [
|
||||
"bugfix/transform-safari-block-shadowing",
|
||||
"bugfix/transform-safari-for-shadowing"
|
||||
],
|
||||
"transform-template-literals": [
|
||||
"bugfix/transform-tagged-template-caching"
|
||||
],
|
||||
"transform-optional-chaining": [
|
||||
"bugfix/transform-v8-spread-parameters-in-optional-chaining"
|
||||
],
|
||||
"proposal-optional-chaining": [
|
||||
"bugfix/transform-v8-spread-parameters-in-optional-chaining"
|
||||
],
|
||||
"transform-class-properties": [
|
||||
"bugfix/transform-v8-static-class-fields-redefine-readonly",
|
||||
"bugfix/transform-firefox-class-in-computed-class-key",
|
||||
"bugfix/transform-safari-class-field-initializer-scope"
|
||||
],
|
||||
"proposal-class-properties": [
|
||||
"bugfix/transform-v8-static-class-fields-redefine-readonly",
|
||||
"bugfix/transform-firefox-class-in-computed-class-key",
|
||||
"bugfix/transform-safari-class-field-initializer-scope"
|
||||
]
|
||||
}
|
||||
203
node_modules/@babel/compat-data/data/plugin-bugfixes.json
generated
vendored
Normal file
203
node_modules/@babel/compat-data/data/plugin-bugfixes.json
generated
vendored
Normal file
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"bugfix/transform-async-arrows-in-class": {
|
||||
"chrome": "55",
|
||||
"opera": "42",
|
||||
"edge": "15",
|
||||
"firefox": "52",
|
||||
"safari": "11",
|
||||
"node": "7.6",
|
||||
"deno": "1",
|
||||
"ios": "11",
|
||||
"samsung": "6",
|
||||
"opera_mobile": "42",
|
||||
"electron": "1.6"
|
||||
},
|
||||
"bugfix/transform-edge-default-parameters": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "18",
|
||||
"firefox": "52",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"bugfix/transform-edge-function-name": {
|
||||
"chrome": "51",
|
||||
"opera": "38",
|
||||
"edge": "79",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6.5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.2"
|
||||
},
|
||||
"bugfix/transform-safari-block-shadowing": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "12",
|
||||
"firefox": "44",
|
||||
"safari": "11",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ie": "11",
|
||||
"ios": "11",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"bugfix/transform-safari-for-shadowing": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "12",
|
||||
"firefox": "4",
|
||||
"safari": "11",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ie": "11",
|
||||
"ios": "11",
|
||||
"samsung": "5",
|
||||
"rhino": "1.7.13",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"bugfix/transform-safari-id-destructuring-collision-in-function-expression": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "14",
|
||||
"firefox": "2",
|
||||
"safari": "16.3",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "16.3",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"bugfix/transform-tagged-template-caching": {
|
||||
"chrome": "41",
|
||||
"opera": "28",
|
||||
"edge": "12",
|
||||
"firefox": "34",
|
||||
"safari": "13",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "13",
|
||||
"samsung": "3.4",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "28",
|
||||
"electron": "0.21"
|
||||
},
|
||||
"bugfix/transform-v8-spread-parameters-in-optional-chaining": {
|
||||
"chrome": "91",
|
||||
"opera": "77",
|
||||
"edge": "91",
|
||||
"firefox": "74",
|
||||
"safari": "13.1",
|
||||
"node": "16.9",
|
||||
"deno": "1.9",
|
||||
"ios": "13.4",
|
||||
"samsung": "16",
|
||||
"opera_mobile": "64",
|
||||
"electron": "13.0"
|
||||
},
|
||||
"transform-optional-chaining": {
|
||||
"chrome": "80",
|
||||
"opera": "67",
|
||||
"edge": "80",
|
||||
"firefox": "74",
|
||||
"safari": "13.1",
|
||||
"node": "14",
|
||||
"deno": "1",
|
||||
"ios": "13.4",
|
||||
"samsung": "13",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "57",
|
||||
"electron": "8.0"
|
||||
},
|
||||
"proposal-optional-chaining": {
|
||||
"chrome": "80",
|
||||
"opera": "67",
|
||||
"edge": "80",
|
||||
"firefox": "74",
|
||||
"safari": "13.1",
|
||||
"node": "14",
|
||||
"deno": "1",
|
||||
"ios": "13.4",
|
||||
"samsung": "13",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "57",
|
||||
"electron": "8.0"
|
||||
},
|
||||
"transform-parameters": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "15",
|
||||
"firefox": "52",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"transform-async-to-generator": {
|
||||
"chrome": "55",
|
||||
"opera": "42",
|
||||
"edge": "15",
|
||||
"firefox": "52",
|
||||
"safari": "10.1",
|
||||
"node": "7.6",
|
||||
"deno": "1",
|
||||
"ios": "10.3",
|
||||
"samsung": "6",
|
||||
"opera_mobile": "42",
|
||||
"electron": "1.6"
|
||||
},
|
||||
"transform-template-literals": {
|
||||
"chrome": "41",
|
||||
"opera": "28",
|
||||
"edge": "13",
|
||||
"firefox": "34",
|
||||
"safari": "9",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "3.4",
|
||||
"opera_mobile": "28",
|
||||
"electron": "0.21"
|
||||
},
|
||||
"transform-function-name": {
|
||||
"chrome": "51",
|
||||
"opera": "38",
|
||||
"edge": "14",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6.5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.2"
|
||||
},
|
||||
"transform-block-scoping": {
|
||||
"chrome": "50",
|
||||
"opera": "37",
|
||||
"edge": "14",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "37",
|
||||
"electron": "1.1"
|
||||
}
|
||||
}
|
||||
838
node_modules/@babel/compat-data/data/plugins.json
generated
vendored
Normal file
838
node_modules/@babel/compat-data/data/plugins.json
generated
vendored
Normal file
@@ -0,0 +1,838 @@
|
||||
{
|
||||
"transform-explicit-resource-management": {
|
||||
"chrome": "134",
|
||||
"edge": "134",
|
||||
"firefox": "141",
|
||||
"node": "24",
|
||||
"electron": "35.0"
|
||||
},
|
||||
"transform-duplicate-named-capturing-groups-regex": {
|
||||
"chrome": "126",
|
||||
"opera": "112",
|
||||
"edge": "126",
|
||||
"firefox": "129",
|
||||
"safari": "17.4",
|
||||
"node": "23",
|
||||
"ios": "17.4",
|
||||
"electron": "31.0"
|
||||
},
|
||||
"transform-regexp-modifiers": {
|
||||
"chrome": "125",
|
||||
"opera": "111",
|
||||
"edge": "125",
|
||||
"firefox": "132",
|
||||
"node": "23",
|
||||
"samsung": "27",
|
||||
"electron": "31.0"
|
||||
},
|
||||
"transform-unicode-sets-regex": {
|
||||
"chrome": "112",
|
||||
"opera": "98",
|
||||
"edge": "112",
|
||||
"firefox": "116",
|
||||
"safari": "17",
|
||||
"node": "20",
|
||||
"deno": "1.32",
|
||||
"ios": "17",
|
||||
"samsung": "23",
|
||||
"opera_mobile": "75",
|
||||
"electron": "24.0"
|
||||
},
|
||||
"bugfix/transform-v8-static-class-fields-redefine-readonly": {
|
||||
"chrome": "98",
|
||||
"opera": "84",
|
||||
"edge": "98",
|
||||
"firefox": "75",
|
||||
"safari": "15",
|
||||
"node": "12",
|
||||
"deno": "1.18",
|
||||
"ios": "15",
|
||||
"samsung": "11",
|
||||
"opera_mobile": "52",
|
||||
"electron": "17.0"
|
||||
},
|
||||
"bugfix/transform-firefox-class-in-computed-class-key": {
|
||||
"chrome": "74",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "126",
|
||||
"safari": "16",
|
||||
"node": "12",
|
||||
"deno": "1",
|
||||
"ios": "16",
|
||||
"samsung": "11",
|
||||
"opera_mobile": "53",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"bugfix/transform-safari-class-field-initializer-scope": {
|
||||
"chrome": "74",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "69",
|
||||
"safari": "16",
|
||||
"node": "12",
|
||||
"deno": "1",
|
||||
"ios": "16",
|
||||
"samsung": "11",
|
||||
"opera_mobile": "53",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"transform-class-static-block": {
|
||||
"chrome": "94",
|
||||
"opera": "80",
|
||||
"edge": "94",
|
||||
"firefox": "93",
|
||||
"safari": "16.4",
|
||||
"node": "16.11",
|
||||
"deno": "1.14",
|
||||
"ios": "16.4",
|
||||
"samsung": "17",
|
||||
"opera_mobile": "66",
|
||||
"electron": "15.0"
|
||||
},
|
||||
"proposal-class-static-block": {
|
||||
"chrome": "94",
|
||||
"opera": "80",
|
||||
"edge": "94",
|
||||
"firefox": "93",
|
||||
"safari": "16.4",
|
||||
"node": "16.11",
|
||||
"deno": "1.14",
|
||||
"ios": "16.4",
|
||||
"samsung": "17",
|
||||
"opera_mobile": "66",
|
||||
"electron": "15.0"
|
||||
},
|
||||
"transform-private-property-in-object": {
|
||||
"chrome": "91",
|
||||
"opera": "77",
|
||||
"edge": "91",
|
||||
"firefox": "90",
|
||||
"safari": "15",
|
||||
"node": "16.9",
|
||||
"deno": "1.9",
|
||||
"ios": "15",
|
||||
"samsung": "16",
|
||||
"opera_mobile": "64",
|
||||
"electron": "13.0"
|
||||
},
|
||||
"proposal-private-property-in-object": {
|
||||
"chrome": "91",
|
||||
"opera": "77",
|
||||
"edge": "91",
|
||||
"firefox": "90",
|
||||
"safari": "15",
|
||||
"node": "16.9",
|
||||
"deno": "1.9",
|
||||
"ios": "15",
|
||||
"samsung": "16",
|
||||
"opera_mobile": "64",
|
||||
"electron": "13.0"
|
||||
},
|
||||
"transform-class-properties": {
|
||||
"chrome": "74",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "90",
|
||||
"safari": "14.1",
|
||||
"node": "12",
|
||||
"deno": "1",
|
||||
"ios": "14.5",
|
||||
"samsung": "11",
|
||||
"opera_mobile": "53",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"proposal-class-properties": {
|
||||
"chrome": "74",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "90",
|
||||
"safari": "14.1",
|
||||
"node": "12",
|
||||
"deno": "1",
|
||||
"ios": "14.5",
|
||||
"samsung": "11",
|
||||
"opera_mobile": "53",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"transform-private-methods": {
|
||||
"chrome": "84",
|
||||
"opera": "70",
|
||||
"edge": "84",
|
||||
"firefox": "90",
|
||||
"safari": "15",
|
||||
"node": "14.6",
|
||||
"deno": "1",
|
||||
"ios": "15",
|
||||
"samsung": "14",
|
||||
"opera_mobile": "60",
|
||||
"electron": "10.0"
|
||||
},
|
||||
"proposal-private-methods": {
|
||||
"chrome": "84",
|
||||
"opera": "70",
|
||||
"edge": "84",
|
||||
"firefox": "90",
|
||||
"safari": "15",
|
||||
"node": "14.6",
|
||||
"deno": "1",
|
||||
"ios": "15",
|
||||
"samsung": "14",
|
||||
"opera_mobile": "60",
|
||||
"electron": "10.0"
|
||||
},
|
||||
"transform-numeric-separator": {
|
||||
"chrome": "75",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "70",
|
||||
"safari": "13",
|
||||
"node": "12.5",
|
||||
"deno": "1",
|
||||
"ios": "13",
|
||||
"samsung": "11",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "54",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"proposal-numeric-separator": {
|
||||
"chrome": "75",
|
||||
"opera": "62",
|
||||
"edge": "79",
|
||||
"firefox": "70",
|
||||
"safari": "13",
|
||||
"node": "12.5",
|
||||
"deno": "1",
|
||||
"ios": "13",
|
||||
"samsung": "11",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "54",
|
||||
"electron": "6.0"
|
||||
},
|
||||
"transform-logical-assignment-operators": {
|
||||
"chrome": "85",
|
||||
"opera": "71",
|
||||
"edge": "85",
|
||||
"firefox": "79",
|
||||
"safari": "14",
|
||||
"node": "15",
|
||||
"deno": "1.2",
|
||||
"ios": "14",
|
||||
"samsung": "14",
|
||||
"opera_mobile": "60",
|
||||
"electron": "10.0"
|
||||
},
|
||||
"proposal-logical-assignment-operators": {
|
||||
"chrome": "85",
|
||||
"opera": "71",
|
||||
"edge": "85",
|
||||
"firefox": "79",
|
||||
"safari": "14",
|
||||
"node": "15",
|
||||
"deno": "1.2",
|
||||
"ios": "14",
|
||||
"samsung": "14",
|
||||
"opera_mobile": "60",
|
||||
"electron": "10.0"
|
||||
},
|
||||
"transform-nullish-coalescing-operator": {
|
||||
"chrome": "80",
|
||||
"opera": "67",
|
||||
"edge": "80",
|
||||
"firefox": "72",
|
||||
"safari": "13.1",
|
||||
"node": "14",
|
||||
"deno": "1",
|
||||
"ios": "13.4",
|
||||
"samsung": "13",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "57",
|
||||
"electron": "8.0"
|
||||
},
|
||||
"proposal-nullish-coalescing-operator": {
|
||||
"chrome": "80",
|
||||
"opera": "67",
|
||||
"edge": "80",
|
||||
"firefox": "72",
|
||||
"safari": "13.1",
|
||||
"node": "14",
|
||||
"deno": "1",
|
||||
"ios": "13.4",
|
||||
"samsung": "13",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "57",
|
||||
"electron": "8.0"
|
||||
},
|
||||
"transform-optional-chaining": {
|
||||
"chrome": "91",
|
||||
"opera": "77",
|
||||
"edge": "91",
|
||||
"firefox": "74",
|
||||
"safari": "13.1",
|
||||
"node": "16.9",
|
||||
"deno": "1.9",
|
||||
"ios": "13.4",
|
||||
"samsung": "16",
|
||||
"opera_mobile": "64",
|
||||
"electron": "13.0"
|
||||
},
|
||||
"proposal-optional-chaining": {
|
||||
"chrome": "91",
|
||||
"opera": "77",
|
||||
"edge": "91",
|
||||
"firefox": "74",
|
||||
"safari": "13.1",
|
||||
"node": "16.9",
|
||||
"deno": "1.9",
|
||||
"ios": "13.4",
|
||||
"samsung": "16",
|
||||
"opera_mobile": "64",
|
||||
"electron": "13.0"
|
||||
},
|
||||
"transform-json-strings": {
|
||||
"chrome": "66",
|
||||
"opera": "53",
|
||||
"edge": "79",
|
||||
"firefox": "62",
|
||||
"safari": "12",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "12",
|
||||
"samsung": "9",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"proposal-json-strings": {
|
||||
"chrome": "66",
|
||||
"opera": "53",
|
||||
"edge": "79",
|
||||
"firefox": "62",
|
||||
"safari": "12",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "12",
|
||||
"samsung": "9",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-optional-catch-binding": {
|
||||
"chrome": "66",
|
||||
"opera": "53",
|
||||
"edge": "79",
|
||||
"firefox": "58",
|
||||
"safari": "11.1",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "9",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"proposal-optional-catch-binding": {
|
||||
"chrome": "66",
|
||||
"opera": "53",
|
||||
"edge": "79",
|
||||
"firefox": "58",
|
||||
"safari": "11.1",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "9",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-parameters": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "18",
|
||||
"firefox": "52",
|
||||
"safari": "16.3",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "16.3",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"transform-async-generator-functions": {
|
||||
"chrome": "63",
|
||||
"opera": "50",
|
||||
"edge": "79",
|
||||
"firefox": "57",
|
||||
"safari": "12",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "12",
|
||||
"samsung": "8",
|
||||
"opera_mobile": "46",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"proposal-async-generator-functions": {
|
||||
"chrome": "63",
|
||||
"opera": "50",
|
||||
"edge": "79",
|
||||
"firefox": "57",
|
||||
"safari": "12",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "12",
|
||||
"samsung": "8",
|
||||
"opera_mobile": "46",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-object-rest-spread": {
|
||||
"chrome": "60",
|
||||
"opera": "47",
|
||||
"edge": "79",
|
||||
"firefox": "55",
|
||||
"safari": "11.1",
|
||||
"node": "8.3",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "8",
|
||||
"opera_mobile": "44",
|
||||
"electron": "2.0"
|
||||
},
|
||||
"proposal-object-rest-spread": {
|
||||
"chrome": "60",
|
||||
"opera": "47",
|
||||
"edge": "79",
|
||||
"firefox": "55",
|
||||
"safari": "11.1",
|
||||
"node": "8.3",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "8",
|
||||
"opera_mobile": "44",
|
||||
"electron": "2.0"
|
||||
},
|
||||
"transform-dotall-regex": {
|
||||
"chrome": "62",
|
||||
"opera": "49",
|
||||
"edge": "79",
|
||||
"firefox": "78",
|
||||
"safari": "11.1",
|
||||
"node": "8.10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "8",
|
||||
"rhino": "1.7.15",
|
||||
"opera_mobile": "46",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-unicode-property-regex": {
|
||||
"chrome": "64",
|
||||
"opera": "51",
|
||||
"edge": "79",
|
||||
"firefox": "78",
|
||||
"safari": "11.1",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "9",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"proposal-unicode-property-regex": {
|
||||
"chrome": "64",
|
||||
"opera": "51",
|
||||
"edge": "79",
|
||||
"firefox": "78",
|
||||
"safari": "11.1",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "9",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-named-capturing-groups-regex": {
|
||||
"chrome": "64",
|
||||
"opera": "51",
|
||||
"edge": "79",
|
||||
"firefox": "78",
|
||||
"safari": "11.1",
|
||||
"node": "10",
|
||||
"deno": "1",
|
||||
"ios": "11.3",
|
||||
"samsung": "9",
|
||||
"opera_mobile": "47",
|
||||
"electron": "3.0"
|
||||
},
|
||||
"transform-async-to-generator": {
|
||||
"chrome": "55",
|
||||
"opera": "42",
|
||||
"edge": "15",
|
||||
"firefox": "52",
|
||||
"safari": "11",
|
||||
"node": "7.6",
|
||||
"deno": "1",
|
||||
"ios": "11",
|
||||
"samsung": "6",
|
||||
"opera_mobile": "42",
|
||||
"electron": "1.6"
|
||||
},
|
||||
"transform-exponentiation-operator": {
|
||||
"chrome": "52",
|
||||
"opera": "39",
|
||||
"edge": "14",
|
||||
"firefox": "52",
|
||||
"safari": "10.1",
|
||||
"node": "7",
|
||||
"deno": "1",
|
||||
"ios": "10.3",
|
||||
"samsung": "6",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.3"
|
||||
},
|
||||
"transform-template-literals": {
|
||||
"chrome": "41",
|
||||
"opera": "28",
|
||||
"edge": "13",
|
||||
"firefox": "34",
|
||||
"safari": "13",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "13",
|
||||
"samsung": "3.4",
|
||||
"opera_mobile": "28",
|
||||
"electron": "0.21"
|
||||
},
|
||||
"transform-literals": {
|
||||
"chrome": "44",
|
||||
"opera": "31",
|
||||
"edge": "12",
|
||||
"firefox": "53",
|
||||
"safari": "9",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "4",
|
||||
"rhino": "1.7.15",
|
||||
"opera_mobile": "32",
|
||||
"electron": "0.30"
|
||||
},
|
||||
"transform-function-name": {
|
||||
"chrome": "51",
|
||||
"opera": "38",
|
||||
"edge": "79",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6.5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.2"
|
||||
},
|
||||
"transform-arrow-functions": {
|
||||
"chrome": "47",
|
||||
"opera": "34",
|
||||
"edge": "13",
|
||||
"firefox": "43",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"rhino": "1.7.13",
|
||||
"opera_mobile": "34",
|
||||
"electron": "0.36"
|
||||
},
|
||||
"transform-block-scoped-functions": {
|
||||
"chrome": "41",
|
||||
"opera": "28",
|
||||
"edge": "12",
|
||||
"firefox": "46",
|
||||
"safari": "10",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ie": "11",
|
||||
"ios": "10",
|
||||
"samsung": "3.4",
|
||||
"opera_mobile": "28",
|
||||
"electron": "0.21"
|
||||
},
|
||||
"transform-classes": {
|
||||
"chrome": "46",
|
||||
"opera": "33",
|
||||
"edge": "13",
|
||||
"firefox": "45",
|
||||
"safari": "10",
|
||||
"node": "5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "33",
|
||||
"electron": "0.36"
|
||||
},
|
||||
"transform-object-super": {
|
||||
"chrome": "46",
|
||||
"opera": "33",
|
||||
"edge": "13",
|
||||
"firefox": "45",
|
||||
"safari": "10",
|
||||
"node": "5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "33",
|
||||
"electron": "0.36"
|
||||
},
|
||||
"transform-shorthand-properties": {
|
||||
"chrome": "43",
|
||||
"opera": "30",
|
||||
"edge": "12",
|
||||
"firefox": "33",
|
||||
"safari": "9",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "4",
|
||||
"rhino": "1.7.14",
|
||||
"opera_mobile": "30",
|
||||
"electron": "0.27"
|
||||
},
|
||||
"transform-duplicate-keys": {
|
||||
"chrome": "42",
|
||||
"opera": "29",
|
||||
"edge": "12",
|
||||
"firefox": "34",
|
||||
"safari": "9",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "3.4",
|
||||
"opera_mobile": "29",
|
||||
"electron": "0.25"
|
||||
},
|
||||
"transform-computed-properties": {
|
||||
"chrome": "44",
|
||||
"opera": "31",
|
||||
"edge": "12",
|
||||
"firefox": "34",
|
||||
"safari": "7.1",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "8",
|
||||
"samsung": "4",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "32",
|
||||
"electron": "0.30"
|
||||
},
|
||||
"transform-for-of": {
|
||||
"chrome": "51",
|
||||
"opera": "38",
|
||||
"edge": "15",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6.5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.2"
|
||||
},
|
||||
"transform-sticky-regex": {
|
||||
"chrome": "49",
|
||||
"opera": "36",
|
||||
"edge": "13",
|
||||
"firefox": "3",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"rhino": "1.7.15",
|
||||
"opera_mobile": "36",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"transform-unicode-escapes": {
|
||||
"chrome": "44",
|
||||
"opera": "31",
|
||||
"edge": "12",
|
||||
"firefox": "53",
|
||||
"safari": "9",
|
||||
"node": "4",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "4",
|
||||
"rhino": "1.7.15",
|
||||
"opera_mobile": "32",
|
||||
"electron": "0.30"
|
||||
},
|
||||
"transform-unicode-regex": {
|
||||
"chrome": "50",
|
||||
"opera": "37",
|
||||
"edge": "13",
|
||||
"firefox": "46",
|
||||
"safari": "12",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "12",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "37",
|
||||
"electron": "1.1"
|
||||
},
|
||||
"transform-spread": {
|
||||
"chrome": "46",
|
||||
"opera": "33",
|
||||
"edge": "13",
|
||||
"firefox": "45",
|
||||
"safari": "10",
|
||||
"node": "5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "33",
|
||||
"electron": "0.36"
|
||||
},
|
||||
"transform-destructuring": {
|
||||
"chrome": "51",
|
||||
"opera": "38",
|
||||
"edge": "15",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6.5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "41",
|
||||
"electron": "1.2"
|
||||
},
|
||||
"transform-block-scoping": {
|
||||
"chrome": "50",
|
||||
"opera": "37",
|
||||
"edge": "14",
|
||||
"firefox": "53",
|
||||
"safari": "11",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "11",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "37",
|
||||
"electron": "1.1"
|
||||
},
|
||||
"transform-typeof-symbol": {
|
||||
"chrome": "48",
|
||||
"opera": "35",
|
||||
"edge": "12",
|
||||
"firefox": "36",
|
||||
"safari": "9",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "9",
|
||||
"samsung": "5",
|
||||
"rhino": "1.8",
|
||||
"opera_mobile": "35",
|
||||
"electron": "0.37"
|
||||
},
|
||||
"transform-new-target": {
|
||||
"chrome": "46",
|
||||
"opera": "33",
|
||||
"edge": "14",
|
||||
"firefox": "41",
|
||||
"safari": "10",
|
||||
"node": "5",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "33",
|
||||
"electron": "0.36"
|
||||
},
|
||||
"transform-regenerator": {
|
||||
"chrome": "50",
|
||||
"opera": "37",
|
||||
"edge": "13",
|
||||
"firefox": "53",
|
||||
"safari": "10",
|
||||
"node": "6",
|
||||
"deno": "1",
|
||||
"ios": "10",
|
||||
"samsung": "5",
|
||||
"opera_mobile": "37",
|
||||
"electron": "1.1"
|
||||
},
|
||||
"transform-member-expression-literals": {
|
||||
"chrome": "7",
|
||||
"opera": "12",
|
||||
"edge": "12",
|
||||
"firefox": "2",
|
||||
"safari": "5.1",
|
||||
"node": "0.4",
|
||||
"deno": "1",
|
||||
"ie": "9",
|
||||
"android": "4",
|
||||
"ios": "6",
|
||||
"phantom": "1.9",
|
||||
"samsung": "1",
|
||||
"rhino": "1.7.13",
|
||||
"opera_mobile": "12",
|
||||
"electron": "0.20"
|
||||
},
|
||||
"transform-property-literals": {
|
||||
"chrome": "7",
|
||||
"opera": "12",
|
||||
"edge": "12",
|
||||
"firefox": "2",
|
||||
"safari": "5.1",
|
||||
"node": "0.4",
|
||||
"deno": "1",
|
||||
"ie": "9",
|
||||
"android": "4",
|
||||
"ios": "6",
|
||||
"phantom": "1.9",
|
||||
"samsung": "1",
|
||||
"rhino": "1.7.13",
|
||||
"opera_mobile": "12",
|
||||
"electron": "0.20"
|
||||
},
|
||||
"transform-reserved-words": {
|
||||
"chrome": "13",
|
||||
"opera": "10.50",
|
||||
"edge": "12",
|
||||
"firefox": "2",
|
||||
"safari": "3.1",
|
||||
"node": "0.6",
|
||||
"deno": "1",
|
||||
"ie": "9",
|
||||
"android": "4.4",
|
||||
"ios": "6",
|
||||
"phantom": "1.9",
|
||||
"samsung": "1",
|
||||
"rhino": "1.7.13",
|
||||
"opera_mobile": "10.1",
|
||||
"electron": "0.20"
|
||||
},
|
||||
"transform-export-namespace-from": {
|
||||
"chrome": "72",
|
||||
"deno": "1.0",
|
||||
"edge": "79",
|
||||
"firefox": "80",
|
||||
"node": "13.2.0",
|
||||
"opera": "60",
|
||||
"opera_mobile": "51",
|
||||
"safari": "14.1",
|
||||
"ios": "14.5",
|
||||
"samsung": "11.0",
|
||||
"android": "72",
|
||||
"electron": "5.0"
|
||||
},
|
||||
"proposal-export-namespace-from": {
|
||||
"chrome": "72",
|
||||
"deno": "1.0",
|
||||
"edge": "79",
|
||||
"firefox": "80",
|
||||
"node": "13.2.0",
|
||||
"opera": "60",
|
||||
"opera_mobile": "51",
|
||||
"safari": "14.1",
|
||||
"ios": "14.5",
|
||||
"samsung": "11.0",
|
||||
"android": "72",
|
||||
"electron": "5.0"
|
||||
}
|
||||
}
|
||||
2
node_modules/@babel/compat-data/native-modules.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/native-modules.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file, in Babel 8 users import the .json directly
|
||||
module.exports = require("./data/native-modules.json");
|
||||
2
node_modules/@babel/compat-data/overlapping-plugins.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/overlapping-plugins.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file, in Babel 8 users import the .json directly
|
||||
module.exports = require("./data/overlapping-plugins.json");
|
||||
40
node_modules/@babel/compat-data/package.json
generated
vendored
Normal file
40
node_modules/@babel/compat-data/package.json
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "@babel/compat-data",
|
||||
"version": "7.28.5",
|
||||
"author": "The Babel Team (https://babel.dev/team)",
|
||||
"license": "MIT",
|
||||
"description": "The compat-data to determine required Babel plugins",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-compat-data"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"exports": {
|
||||
"./plugins": "./plugins.js",
|
||||
"./native-modules": "./native-modules.js",
|
||||
"./corejs2-built-ins": "./corejs2-built-ins.js",
|
||||
"./corejs3-shipped-proposals": "./corejs3-shipped-proposals.js",
|
||||
"./overlapping-plugins": "./overlapping-plugins.js",
|
||||
"./plugin-bugfixes": "./plugin-bugfixes.js"
|
||||
},
|
||||
"scripts": {
|
||||
"build-data": "./scripts/download-compat-table.sh && node ./scripts/build-data.mjs && node ./scripts/build-modules-support.mjs && node ./scripts/build-bugfixes-targets.mjs"
|
||||
},
|
||||
"keywords": [
|
||||
"babel",
|
||||
"compat-table",
|
||||
"compat-data"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@mdn/browser-compat-data": "^6.0.8",
|
||||
"core-js-compat": "^3.43.0",
|
||||
"electron-to-chromium": "^1.5.140"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"type": "commonjs"
|
||||
}
|
||||
2
node_modules/@babel/compat-data/plugin-bugfixes.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/plugin-bugfixes.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file, in Babel 8 users import the .json directly
|
||||
module.exports = require("./data/plugin-bugfixes.json");
|
||||
2
node_modules/@babel/compat-data/plugins.js
generated
vendored
Normal file
2
node_modules/@babel/compat-data/plugins.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// Todo (Babel 8): remove this file, in Babel 8 users import the .json directly
|
||||
module.exports = require("./data/plugins.json");
|
||||
22
node_modules/@babel/core/LICENSE
generated
vendored
Normal file
22
node_modules/@babel/core/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user