Orca native components for rendering special content markers in Vue applications
npm install @orca-pt/orca-components

Native Vue 3 components for rendering rich content using Orca Markers. Designed for chat applications, messaging systems, and any interface that requires dynamic content rendering with Vuetify.
- πΌοΈ Image Display - With modal zoom and loading states
- π¬ Video Playback - Video.js player and YouTube embed support
- π΅ Audio Player - Customizable audio playback
- πΊοΈ Maps - Mapbox GL JS integration
- π΄ Card Lists - Display content in beautiful card layouts
- π Interactive Buttons - Action and link buttons with events
- π Markdown - Full markdown rendering with syntax highlighting
- β‘ Loading States - Smart loading indicators for all content types
- π Tracing - Debug trace logs display
- π― TypeScript - Full TypeScript support with type definitions
- π¨ Tailwind CSS - Built with Tailwind utility classes (prefixed tw-)
- π Stream Support - Real-time content streaming compatible
---
``bash`
npm install @orcapt/orca-componentsor
yarn add @orcapt/orca-componentsor
pnpm add @orcapt/orca-components
Package: @orcapt/orca-components
---
`vue
`
`vue
:key="msg.id"
:description="msg.content"
:role="msg.role"
:isLastMessage="msg.id === lastMessageId"
@send-message="handleButtonClick"
/>
`
---
> π Complete Reference: See MARKERS_REFERENCE.md for a comprehensive guide to all supported markers.
`markdown`
[orca.image.start]
https://example.com/image.jpg
[orca.image.end]
With loading state:
`markdown
[orca.loading.image.start]
[orca.image.start]
https://example.com/image.jpg
[orca.image.end]
`
Regular Video:
`markdown`
[orca.video.start]
https://example.com/video.mp4
[orca.video.end]
YouTube:
`markdown`
[orca.youtube.start]
https://www.youtube.com/watch?v=dQw4w9WgXcQ
[orca.youtube.end]
With Loading:
`markdown
[orca.loading.video.start]
[orca.video.start]
https://example.com/video.mp4
[orca.video.end]
`
`markdown`
[orca.location.start]
35.6892, 51.3890
[orca.location.end]
`yaml`
[orca.buttons.start]
- type: action
label: Option 1
id: option1
color: primary
row: 1
- type: action
label: Option 2
id: option2
color: secondary
row: 1
- type: link
label: Visit Website
url: https://example.com
color: info
row: 2
[orca.buttons.end]
Properties:
- type: action or linkcolor
- : Vuetify colors (primary, secondary, error, success, warning, info)row
- : Row number for grouping buttonsid
- : Unique identifier (for action buttons)url
- : Link URL (for link buttons)
`yaml`
[orca.list.card.start]
- photo: https://example.com/image1.jpg
header: Card Title 1
subheader: Card description 1
text: Additional content for card 1
- photo: https://example.com/image2.jpg
header: Card Title 2
subheader: Card description 2
text: Additional content for card 2
[orca.list.card.end]
With Loading:
`markdown`
[orca.loading.card.start]
`yaml`
[orca.audio.start]
- label: Track 1
url: https://example.com/audio1.mp3
type: audio/mp3
- label: Track 2
url: https://example.com/audio2.mp3
type: audio/mp3
[orca.audio.end]
`yaml`
[orca.tracing.start]
visibility: admin
content: {
"request_id": "req_123456",
"timestamp": "2024-12-10T12:00:00Z",
"duration": "245ms",
"status": "success"
}
[orca.tracing.end]
Visibility Options:
- all: Visible to everyoneadmin
- : Only visible to admins
General Loading:
`markdown`
[orca.loading.start]
Image Loading:
`markdown`
[orca.loading.image.start]
Video Loading:
`markdown`
[orca.loading.video.start]
Card Loading:
`markdown`
[orca.loading.card.start]
Note: Loading markers don't need an end tag - they're replaced when actual content arrives.
---
`typescript
interface OrcaMarkdownProps {
/* Content string with Orca markers /
description: string;
/* Sender role /
role: "user" | "assistant";
/* Additional images /
images?: Record
/* Attached files /
fileAttachments?: string[];
/* Is this the last message? (enables buttons) /
isLastMessage?: boolean;
/* Store identifier for message management /
storeIdentifier?: string;
/* Visibility level /
visibility?: "all" | "admin";
/* Agent ID /
agentId?: string;
/* Message ID /
messageId?: string;
}
`
---
Emitted when user clicks action buttons:
`typescript`
interface SendMessageData {
message: string;
buttonData?: ButtonData;
type: "text" | "button-action" | "button-link";
}
Example:
`vue
role="assistant"
@send-message="handleSendMessage"
/>
`
---
The component uses a default token, but for production you should use your own:
`typescript
// In your main app file
import mapboxgl from "mapbox-gl";
mapboxgl.accessToken = "YOUR_MAPBOX_TOKEN";
`
`vue`
All Tailwind classes are prefixed with tw- to avoid conflicts:
`html`
---
`bashClone repository
git clone
cd orca-components-package
$3
`bash
Build, pack, and install in one command
npm run quick-deployOr use the bash script
./dev-deploy.sh
`See DEV_GUIDE.md for detailed development instructions.
---
π Changelog
See CHANGELOG.md for release notes.
---
π Complete Markers Reference
For a complete reference of all supported Orca markers, see MARKERS_REFERENCE.md.
This includes:
- β
All loading markers (
orca.loading.*, orca.image.loading, etc.)
- β
All content markers (image, video, location, card, buttons, audio, tracing)
- β
Complete usage examples
- β
Best practices
- β
Format specifications---
π€ Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch (
git checkout -b feature/amazing-feature)
3. Commit your changes (git commit -m 'Add amazing feature')
4. Push to the branch (git push origin feature/amazing-feature`)---
To report bugs or request features:
---
MIT Β© Orca Team
---
Built with amazing tools:
- Vue.js
- Vuetify
- Tailwind CSS
- Mapbox GL JS
- Video.js
- Markdown-it
- Highlight.js
- KaTeX
---
Made with β€οΈ by the Orca Team