feat(monorepo): migrate prototype code to organized package structure

Migrate all prototype code from vjs10-prototype repository into the
monorepo structure following established dependency hierarchy and
package organization patterns.

Core packages migrated:
- @vjs-10/media-store: Complete media store with nanostores integration
- @vjs-10/playback-engine: HLS.js playback engine implementation
- @vjs-10/media: Core media state owner and interfaces

HTML packages migrated:
- @vjs-10/html-icons: Web component icons with proper base classes
- @vjs-10/html-media-elements: Context provider integration
- @vjs-10/html: Main HTML UI components, skins, and utilities

React packages migrated:
- @vjs-10/react-icons: React icon components
- @vjs-10/react-media-elements: Video component with state integration
- @vjs-10/react-media-store: MediaProvider and React hooks
- @vjs-10/react: Main React UI components and skins

Changes made:
- Updated all imports to use monorepo package names (@vjs-10/*)
- Distributed dependencies to specific packages that use them
- Preserved all prototype functionality and component structure
- Created proper index files for all packages
- Fixed workspace protocol usage for npm compatibility

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Christian Pillsbury
2025-07-29 13:17:46 -07:00
co-authored by Claude
parent fc5a0e46fd
commit 4b472ec49c
61 changed files with 1967 additions and 995 deletions
+1 -84
View File
@@ -1,84 +1 @@
import { MediaStore, MediaState, MediaStateOwner } from '@vjs-10/media-store';
import { VjsMediaElement } from '@vjs-10/html-media-elements';
export class HTMLMediaStateOwner implements MediaStateOwner {
private element: VjsMediaElement;
private listeners: Map<string, EventListener> = new Map();
constructor(element: VjsMediaElement) {
this.element = element;
this.setupEventListeners();
}
getState(): MediaState {
return {
currentTime: this.element.currentTime,
duration: this.element.duration,
paused: this.element.paused,
volume: this.element.volume,
muted: this.element.muted,
};
}
setState(state: Partial<MediaState>): void {
if (state.currentTime !== undefined && state.currentTime !== this.element.currentTime) {
this.element.currentTime = state.currentTime;
}
if (state.volume !== undefined && state.volume !== this.element.volume) {
this.element.volume = state.volume;
}
if (state.muted !== undefined && state.muted !== this.element.muted) {
this.element.muted = state.muted;
}
}
private setupEventListeners() {
const timeUpdateListener = () => {
this.dispatchStateChange();
};
const playPauseListener = () => {
this.dispatchStateChange();
};
const volumeChangeListener = () => {
this.dispatchStateChange();
};
this.element.addEventListener('vjs-timeupdate', timeUpdateListener);
this.element.addEventListener('vjs-play', playPauseListener);
this.element.addEventListener('vjs-pause', playPauseListener);
this.element.addEventListener('volumechange', volumeChangeListener);
this.listeners.set('timeupdate', timeUpdateListener);
this.listeners.set('play', playPauseListener);
this.listeners.set('pause', playPauseListener);
this.listeners.set('volumechange', volumeChangeListener);
}
private dispatchStateChange() {
this.element.dispatchEvent(new CustomEvent('vjs-state-change', {
detail: this.getState()
}));
}
destroy() {
this.listeners.forEach((listener, event) => {
this.element.removeEventListener(event as any, listener);
});
this.listeners.clear();
}
}
export function connectMediaElementToStore(element: VjsMediaElement, store: MediaStore): HTMLMediaStateOwner {
const owner = new HTMLMediaStateOwner(element);
store.addOwner(owner);
element.addEventListener('vjs-state-change', (event: CustomEvent) => {
store.updateState(event.detail);
});
return owner;
}
export { MediaStore, MediaState, MediaStateOwner } from '@vjs-10/media-store';
// Store integration utilities for HTML/Web Components