Skip to main content

@myop/vue

Official Vue bindings for embedding Myop components in your Vue applications.

Myop components are framework-agnostic UI components that can be updated in real-time without redeploying your application. Build once, embed anywhere, and iterate instantly. Perfect for teams that need to ship UI changes fast, A/B test components, or empower non-developers to customize the interface. Myop is also the safest way to adopt AI-generated components in your application—whether created by developers or non-developers—with built-in sandboxing and controlled integration.

npm version License: MIT Discord

Website | Documentation | Dashboard | Discord

Installation

npm install @myop/vue
yarn add @myop/vue
pnpm add @myop/vue

Auto-Generated Vue Components

Myop automatically generates a typed Vue component package for every component you create in the dashboard. Install it directly via npm:

npm install https://cloud.myop.dev/npm/{component-id}/vue

Then import and use it like any Vue component. For example, if you created a table component called "users-table" in the dashboard:

<script setup lang="ts">
import { UsersTable } from "@myop/users-table";

const users = [
{ id: 1, name: "Alice", email: "alice@example.com", role: "Admin" },
{ id: 2, name: "Bob", email: "bob@example.com", role: "User" },
{ id: 3, name: "Charlie", email: "charlie@example.com", role: "User" },
];

function handleRowClicked(payload: { rowData: any }) {
console.log("Selected user:", payload.rowData);
}

function handleDeleteClicked(payload: { userId: number }) {
deleteUser(payload.userId);
}

function handleExportRequested(payload: { format: "csv" | "xlsx" }) {
exportToFormat(payload.format);
}
</script>

<template>
<UsersTable
:data="{ rows: users }"
@row-clicked="handleRowClicked"
@delete-clicked="handleDeleteClicked"
@export-requested="handleExportRequested"
/>
</template>

Why this is powerful:

  • Fully typed — The generated package includes complete TypeScript types for your component's data interface and all CTA event payloads
  • Auto loaded — Components are fetched and rendered automatically, no manual setup required
  • Not in your code — The actual component implementation lives on Myop and is loaded at runtime. Update your component in the dashboard and it's instantly live—no rebuild, no redeploy
  • Zero bundle impact — The entire @myop/vue package costs only ~6KB gzipped—and that's the total cost whether you use 1, 2, or 1,000 components. Auto-generated component packages are just thin typed wrappers. The actual component implementations are loaded at runtime, meaning your Myop components can be as complex, feature-rich, and heavy as you need without adding a single byte to your application bundle. Consider typical bundle costs: a chart library (~60KB), a map component (~200KB), a data grid (~150KB), a rich text editor (~100KB), or a chat widget with emoji picker (~80KB). With Myop, all of these cost ~0KB to your bundle—they load on-demand when needed

Environment options:

Set the default environment for all components using setEnvironment:

import { setEnvironment } from "@myop/vue";

// Set default environment for all component loads
setEnvironment("staging");

You can also override the environment directly on a specific component:

<template>
<UsersTable
:data="{ rows: users }"
:preview="true"
environment="staging"
/>
</template>

Environments are fully configurable in the dashboard, allowing you to test changes in staging before publishing to production.

For more details on auto-generated packages, see the Auto-Generated Packages documentation.

Requirements

  • Vue 3.0+

Quick Start

<script setup lang="ts">
import { MyopComponent } from "@myop/vue";

function handleAction(action: string, payload: any) {
console.log("Action:", action, "Payload:", payload);
}
</script>

<template>
<MyopComponent
componentId="your-component-id"
:style="{ width: '600px', height: '400px' }"
@action="handleAction"
/>
</template>

Components

MyopComponent

The main component for embedding Myop components.

<script setup lang="ts">
import { MyopComponent } from "@myop/vue";

const items = [{ id: 1, name: "Item 1" }, { id: 2, name: "Item 2" }];

function handleRowClicked(payload: any) {
console.log("Row clicked:", payload);
}

function handleLoad(component: any) {
console.log("Loaded!", component);
}

function handleError(error: string) {
console.error("Error:", error);
}
</script>

<template>
<MyopComponent
componentId="abc123"
:data="{ items }"
@row-clicked="handleRowClicked"
@load="handleLoad"
@error="handleError"
/>
</template>

Props

PropTypeDescription
componentIdstringThe ID of the Myop component to load
dataobjectData to pass to the component via myop_init_interface
styleobjectCSS styles for the container
#loaderslotLoading indicator slot (default: no loader). Use <MyopLoader /> for default Myop loader
#fallbackslotError fallback slot (default: <MyopFallback />). Override with custom component
fadeDurationnumberLoader fade-out duration in ms (default: 200)
environmentstringLoad from a specific environment (e.g., "staging", "prod")
previewbooleanLoad the unpublished preview version of the component

Events

EventPayloadDescription
@action(action, payload)Generic handler for all CTA events
@[action-name]payloadHandler for specific actions (e.g., @row-clicked)
@loadcomponentCalled when the component finishes loading
@errorerror: stringCalled when loading fails

Environments & Preview

Myop supports multiple environments, allowing you to test changes before going live:

<template>
<!-- Production (default) -->
<MyopComponent componentId="abc123" />

<!-- Load from staging environment -->
<MyopComponent componentId="abc123" environment="staging" />

<!-- Load unpublished preview version (for testing before publishing) -->
<MyopComponent componentId="abc123" :preview="true" />

<!-- Combine both: preview version in staging -->
<MyopComponent componentId="abc123" environment="staging" :preview="true" />
</template>

Environments are configured in the dashboard. Use :preview="true" to test unpublished changes before making them live.

MyopContainer (Legacy)

The legacy container component. Use MyopComponent for new projects.

<script setup lang="ts">
import { MyopContainer } from "@myop/vue";

function handleReady(component: any) {
console.log("Ready!", component);
}
</script>

<template>
<MyopContainer
componentId="abc123"
:onReady="handleReady"
/>
</template>

Type-Safe Event Handlers

Define your CTA payloads for fully typed event handlers:

<script setup lang="ts">
import { MyopComponent } from "@myop/vue";

// Define your component's data and CTA payload types
interface MyData {
items: { id: string; name: string }[];
}

interface RowClickedPayload {
rowIndex: number;
rowData: any;
}

interface ItemSelectedPayload {
itemId: string;
}

interface ExportRequestedPayload {
format: "csv" | "json";
}

function handleRowClicked(payload: RowClickedPayload) {
console.log("Row clicked:", payload.rowIndex);
}

function handleItemSelected(payload: ItemSelectedPayload) {
console.log("Item selected:", payload.itemId);
}

function handleAction(action: string, payload: any) {
console.log(action, payload);
}
</script>

<template>
<MyopComponent
componentId="dashboard-component"
:data="{ items: [...] }"
@row-clicked="handleRowClicked"
@item-selected="handleItemSelected"
@action="handleAction"
/>
</template>

Configuration

Preloading Components

Preload components for faster rendering:

import { preloadComponents, isPreloaded } from "@myop/vue";

// Preload multiple components
await preloadComponents(["component-1", "component-2"]);

// Check if a component is preloaded
if (isPreloaded("component-1")) {
console.log("Component is cached and ready");
}

Custom Repository URL

import { setCloudRepositoryUrl } from "@myop/vue";

// Point to a custom Myop server
setCloudRepositoryUrl("https://your-custom-server.com");

Environment Configuration

import { setEnvironment } from "@myop/vue";

// Set default environment for all component loads
setEnvironment("staging");

Local Development

import { enableLocalDev } from "@myop/vue";

// Connect to local Myop development server (localhost:9292)
enableLocalDev();

Advanced: Custom Repository

import { setCloudRepository, getCloudRepository } from "@myop/vue";
import { CloudRepository } from "@myop/sdk/helpers";

// Set a custom CloudRepository instance
const customRepo = new CloudRepository("https://custom-url.com");
setCloudRepository(customRepo);

// Get the current repository
const repo = getCloudRepository();

Loading & Error States

By default, no loader is shown while the component loads. The Myop-branded fallback is displayed automatically on error.

Using the Default Myop Loader

<script setup lang="ts">
import { MyopComponent, MyopLoader } from "@myop/vue";
</script>

<template>
<MyopComponent componentId="my-component" :fadeDuration="300">
<template #loader>
<MyopLoader />
</template>
</MyopComponent>
</template>

Custom Loading State

<template>
<MyopComponent componentId="my-component" :fadeDuration="300">
<template #loader>
<div class="custom-loader">
<Spinner />
<p>Loading component...</p>
</div>
</template>
</MyopComponent>
</template>

Custom Error Fallback

<script setup lang="ts">
import { MyopComponent, MyopFallback } from "@myop/vue";
</script>

<template>
<MyopComponent componentId="my-component">
<!-- Custom fallback -->
<template #fallback>
<div class="error-state">
<p>Failed to load component</p>
<button @click="() => window.location.reload()">Retry</button>
</div>
</template>
</MyopComponent>

<!-- Or use default Myop fallback explicitly -->
<MyopComponent componentId="other-component">
<template #fallback>
<MyopFallback />
</template>
</MyopComponent>
</template>

API Reference

Exports

ExportDescription
MyopComponentMain component for embedding Myop components
MyopLoaderDefault Myop-branded loading indicator (opt-in)
MyopFallbackDefault Myop-branded error fallback
preloadComponentsPreload components for faster rendering
isPreloadedCheck if a component is cached
enableLocalDevEnable local development mode
setCloudRepositoryUrlSet custom server URL
setCloudRepositorySet custom CloudRepository instance
getCloudRepositoryGet current CloudRepository instance
setEnvironmentSet default environment

License

MIT