Files
artchat/modules/infinite-canvas/index.ts
Arthur DANJOU 5dadb20607 feat(infinite-canvas): add infinite canvas component with drag and zoom functionality
- Implemented InfiniteCanvas.vue for rendering an infinite canvas with drag and zoom capabilities.
- Created useInfiniteCanvas composable for managing canvas state and interactions.
- Added useImagePreloader composable for preloading images and videos.
- Introduced constants for physics, touch interactions, viewport settings, and zoom defaults.
- Developed utility functions for touch handling and media type detection.
- Defined TypeScript types for canvas items, grid items, and composables.
- Registered components and composables in the Nuxt module.
- Added screenshot generation functionality for content files.
- Updated package.json to include capture-website dependency.
2025-09-05 11:01:11 +02:00

111 lines
2.5 KiB
TypeScript

/**
* @fileoverview Nuxt module for infinite canvas functionality
*/
import { addComponent, addImports, createResolver, defineNuxtModule } from '@nuxt/kit'
/**
* Module configuration options
*/
export interface ModuleOptions {
/** Component name prefix (default: '') */
prefix?: string
}
/**
* Infinite Canvas Nuxt Module
*
* Provides components and composables for creating infinite, zoomable canvases
* with drag interactions, touch support, and performance optimizations.
*
* @example
* ```ts
* // nuxt.config.ts
* export default defineNuxtConfig({
* modules: ['./modules/infinite-canvas']
* })
* ```
*/
export default defineNuxtModule<ModuleOptions>({
meta: {
name: '@nuxt/infinite-canvas',
configKey: 'infiniteCanvas',
},
defaults: {
prefix: '',
},
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
// Register components
addComponent({
name: `${options.prefix}Canvas`,
filePath: resolver.resolve('./components/InfiniteCanvas.vue'),
export: 'default',
})
addComponent({
name: `${options.prefix}CanvasMinimap`,
filePath: resolver.resolve('./components/CanvasMinimap.vue'),
export: 'default',
})
addComponent({
name: `${options.prefix}CanvasLoader`,
filePath: resolver.resolve('./components/CanvasLoader.vue'),
export: 'default',
})
// Register composables
addImports([
{
name: 'useInfiniteCanvas',
from: resolver.resolve('./composables/useInfiniteCanvas'),
as: 'useInfiniteCanvas',
},
{
name: 'useImagePreloader',
from: resolver.resolve('./composables/useImagePreloader'),
as: 'useImagePreloader',
},
])
// Register utilities (optional, for advanced usage)
addImports([
{
name: 'getTouchDistance',
from: resolver.resolve('./utils'),
as: 'getTouchDistance',
},
{
name: 'getTouchCenter',
from: resolver.resolve('./utils'),
as: 'getTouchCenter',
},
{
name: 'isVideo',
from: resolver.resolve('./utils'),
as: 'isVideo',
},
{
name: 'isMobileDevice',
from: resolver.resolve('./utils'),
as: 'isMobileDevice',
},
])
// Add type definitions
nuxt.hook('prepare:types', (options) => {
options.references.push({
path: resolver.resolve('./types'),
})
})
},
})
declare module '@nuxt/schema' {
interface NuxtConfig {
infiniteCanvas?: ModuleOptions
}
}