Skip to content

Guía de Integración Multimarco ​

Tanto <oim-player> como <ovm-player> son Custom Elements estándar del W3C que se integran de forma natural en cualquier framework frontend moderno. A continuación se presentan patrones de código listos para producción para cada tecnología.


1. React 19 y Next.js (App Router / Pages) ​

En aplicaciones React, registra el componente dentro de un efecto para garantizar la hidratación correcta en el cliente:

tsx
'use client';

import React, { useEffect, useRef } from 'react';
import '@oim-media/player-oim';

interface OimViewerProps {
  src: string;
  lang?: string;
  onAction?: (actionName: string) => void;
}

export function OimViewer({ src, lang = 'es', onAction }: OimViewerProps) {
  const playerRef = useRef<HTMLElement>(null);

  useEffect(() => {
    const el = playerRef.current;
    if (!el) return;

    const handleAction = (e: Event) => {
      const customEvent = e as CustomEvent;
      if (onAction) {
        onAction(customEvent.detail.name);
      }
    };

    el.addEventListener('oim:action', handleAction);
    return () => el.removeEventListener('oim:action', handleAction);
  }, [onAction]);

  return (
    <div className="w-full max-w-2xl mx-auto">
      {/* @ts-expect-error custom-element */}
      <oim-player ref={playerRef} src={src} lang={lang} fit="contain" />
    </div>
  );
}

2. Vue 3 (Composition API / Nuxt 3) ​

Vue soporta elementos personalizados de forma nativa sin necesidad de adaptadores:

vue
<template>
  <div class="player-container">
    <oim-player
      ref="playerRef"
      :src="src"
      :lang="activeLang"
      fit="contain"
      @oim:action="handleAction"
    />
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import '@oim-media/player-oim';

const props = defineProps<{ src: string }>();
const activeLang = ref('es');
const playerRef = ref<HTMLElement | null>(null);

const handleAction = (e: CustomEvent) => {
  console.log('Acción seleccionada:', e.detail.name);
};
</script>

3. Svelte 5 y SvelteKit ​

La importación dinámica en el cliente asegura que el renderizado en servidor (SSR) no intente evaluar Custom Elements:

svelte
<script lang="ts">
  import { onMount } from 'svelte';

  export let src: string;
  export let lang: string = 'es';

  onMount(async () => {
    await import('@oim-media/player-oim');
  });
</script>

<div class="oim-wrapper">
  <oim-player {src} {lang} fit="contain"></oim-player>
</div>

<style>
  .oim-wrapper {
    width: 100%;
    aspect-ratio: 16 / 9;
  }
</style>

4. Astro (Arquitectura de Islas) ​

En Astro, las etiquetas <script> se ejecutan exclusivamente en el cliente sin sobrecoste de hidratación:

astro
---
interface Props {
  src: string;
  lang?: string;
}

const { src, lang = 'es' } = Astro.props;
---

<div class="interactive-card">
  <oim-player src={src} lang={lang} fit="contain"></oim-player>
</div>

<script>
  import '@oim-media/player-oim';
</script>

5. JavaScript Puro y HTML5 ​

No se requiere ningún empaquetador ni paso de compilación para páginas web estándar:

html
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <script type="module" src="https://cdn.oim.media/player/v1/oim-player.js"></script>
</head>
<body>
  <oim-player
    id="myPromo"
    src="/media/hero.oim.png"
    lang="es"
    fit="cover">
  </oim-player>

  <script>
    const player = document.getElementById('myPromo');
    player.addEventListener('oim:loaded', () => {
      console.log('¡OIM Listo!');
    });
  </script>
</body>
</html>