{
  "version": 3,
  "sources": ["../../src/records/TLCamera.ts"],
  "sourcesContent": ["import {\n\tBaseRecord,\n\tcreateMigrationIds,\n\tcreateRecordMigrationSequence,\n\tcreateRecordType,\n\tRecordId,\n} from '@tldraw/store'\nimport { JsonObject } from '@tldraw/utils'\nimport { T } from '@tldraw/validate'\nimport { idValidator } from '../misc/id-validator'\n\n/**\n * A camera record representing the viewport's position and zoom level.\n * The camera defines what portion of the infinite canvas is visible to the user.\n *\n * @example\n * ```ts\n * const camera: TLCamera = {\n *   id: 'camera:user1',\n *   typeName: 'camera',\n *   x: 100,    // Camera x position (negative values pan right)\n *   y: 50,     // Camera y position (negative values pan down)\n *   z: 0.5,    // Zoom level (1 = 100%, 0.5 = 50%, 2 = 200%)\n *   meta: {\n *     userId: 'user123',\n *     lastUpdated: Date.now()\n *   }\n * }\n *\n * // Set camera position and zoom\n * editor.setCamera({ x: -200, y: -100, z: 1.5 })\n * ```\n *\n * @public\n */\nexport interface TLCamera extends BaseRecord<'camera', TLCameraId> {\n\t/** Camera x position. Negative values move the viewport right */\n\tx: number\n\t/** Camera y position. Negative values move the viewport down */\n\ty: number\n\t/** Zoom level. 1 = 100%, 0.5 = 50% zoom, 2 = 200% zoom */\n\tz: number\n\t/** User-defined metadata for the camera */\n\tmeta: JsonObject\n}\n\n/**\n * Branded string type for camera record identifiers.\n * Prevents mixing camera IDs with other types of record IDs at compile time.\n *\n * @example\n * ```ts\n * import { CameraRecordType } from '@tldraw/tlschema'\n *\n * // Create a camera ID (typically one per user/session)\n * const cameraId: TLCameraId = CameraRecordType.createId()\n *\n * // Use in camera records\n * const camera: TLCamera = {\n *   id: cameraId,\n *   typeName: 'camera',\n *   x: 0, y: 0, z: 1,\n *   meta: {}\n * }\n *\n * // Get camera from store\n * const currentCamera = store.get(cameraId)\n * ```\n *\n * @public\n */\nexport type TLCameraId = RecordId<TLCamera>\n\n/**\n * Validator for TLCamera records that ensures runtime type safety.\n * Validates camera position coordinates and zoom level.\n *\n * @example\n * ```ts\n * // Validation happens automatically when cameras are stored\n * try {\n *   const validatedCamera = cameraValidator.validate(cameraData)\n *   store.put([validatedCamera])\n * } catch (error) {\n *   console.error('Camera validation failed:', error.message)\n * }\n * ```\n *\n * @public\n */\nexport const cameraValidator: T.Validator<TLCamera> = T.model(\n\t'camera',\n\tT.object({\n\t\ttypeName: T.literal('camera'),\n\t\tid: idValidator<TLCameraId>('camera'),\n\t\tx: T.number,\n\t\ty: T.number,\n\t\tz: T.number,\n\t\tmeta: T.jsonValue as T.ObjectValidator<JsonObject>,\n\t})\n)\n\n/**\n * Migration version identifiers for camera record schema evolution.\n * Each version represents a breaking change that requires data migration.\n *\n * @example\n * ```ts\n * // Check if a camera needs migration\n * const needsMigration = currentVersion < cameraVersions.AddMeta\n * ```\n *\n * @public\n */\nexport const cameraVersions = createMigrationIds('com.tldraw.camera', {\n\tAddMeta: 1,\n})\n\n/**\n * Migration sequence for evolving camera record structure over time.\n * Handles converting camera records from older schema versions to current format.\n *\n * @example\n * ```ts\n * // Migration is applied automatically when loading old documents\n * const migratedStore = migrator.migrateStoreSnapshot({\n *   schema: oldSchema,\n *   store: oldStoreSnapshot\n * })\n * ```\n *\n * @public\n */\nexport const cameraMigrations = createRecordMigrationSequence({\n\tsequenceId: 'com.tldraw.camera',\n\trecordType: 'camera',\n\tsequence: [\n\t\t{\n\t\t\tid: cameraVersions.AddMeta,\n\t\t\tup: (record) => {\n\t\t\t\t;(record as any).meta = {}\n\t\t\t},\n\t\t},\n\t],\n})\n\n/**\n * Record type definition for TLCamera with validation and default properties.\n * Configures cameras as session-scoped records that don't persist across sessions.\n *\n * @example\n * ```ts\n * // Create a new camera record with defaults\n * const cameraRecord = CameraRecordType.create({\n *   id: 'camera:main'\n *   // x: 0, y: 0, z: 1, meta: {} are applied as defaults\n * })\n *\n * // Create with custom position and zoom\n * const customCamera = CameraRecordType.create({\n *   id: 'camera:user1',\n *   x: -100,\n *   y: -50,\n *   z: 1.5,\n *   meta: { userId: 'user123' }\n * })\n *\n * // Store the camera\n * store.put([cameraRecord])\n * ```\n *\n * @public\n */\nexport const CameraRecordType = createRecordType<TLCamera>('camera', {\n\tvalidator: cameraValidator,\n\tscope: 'session',\n}).withDefaultProperties(\n\t(): Omit<TLCamera, 'id' | 'typeName'> => ({\n\t\tx: 0,\n\t\ty: 0,\n\t\tz: 1,\n\t\tmeta: {},\n\t})\n)\n"],
  "mappings": "AAAA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AAEP,SAAS,SAAS;AAClB,SAAS,mBAAmB;AAiFrB,MAAM,kBAAyC,EAAE;AAAA,EACvD;AAAA,EACA,EAAE,OAAO;AAAA,IACR,UAAU,EAAE,QAAQ,QAAQ;AAAA,IAC5B,IAAI,YAAwB,QAAQ;AAAA,IACpC,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,MAAM,EAAE;AAAA,EACT,CAAC;AACF;AAcO,MAAM,iBAAiB,mBAAmB,qBAAqB;AAAA,EACrE,SAAS;AACV,CAAC;AAiBM,MAAM,mBAAmB,8BAA8B;AAAA,EAC7D,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACT;AAAA,MACC,IAAI,eAAe;AAAA,MACnB,IAAI,CAAC,WAAW;AACf;AAAC,QAAC,OAAe,OAAO,CAAC;AAAA,MAC1B;AAAA,IACD;AAAA,EACD;AACD,CAAC;AA6BM,MAAM,mBAAmB,iBAA2B,UAAU;AAAA,EACpE,WAAW;AAAA,EACX,OAAO;AACR,CAAC,EAAE;AAAA,EACF,OAA0C;AAAA,IACzC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,MAAM,CAAC;AAAA,EACR;AACD;",
  "names": []
}
