/** PHY JSON Schema §1 の型。D-1: Schema の必須 type/name/compatibility を採用。 */ export type Point = { x: number; y: number }; export type Transform = { x: number; y: number; rotation: number }; export type Size = { w: number; h: number; x2?: number; y2?: number; w2?: number; h2?: number }; export type Profile = { id: string; name: string; unitSize: Point; visualOffset?: { top: number; right: number; bottom: number; left: number; radius: number }; }; export type KleCompatibility = Record; export type KeyNode = { type: "key"; id: string; profile: string; transform: Transform; size: Size; switchOffset?: Point; partGroup?: string; orientation?: 0 | 90 | 180 | 270; perKeyLED?: boolean; decal?: boolean; ghost?: boolean; labels?: string[]; kleCompatibility?: KleCompatibility; }; export type ComponentNode = { type: "component"; id: string; transform: Transform; partGroup?: string }; export type ClusterNode = { type: "cluster"; id: string; name?: string; transform: Transform; children: Node[]; }; export type Variant = { type: "variant"; id: string; name: string; children: Node[] }; export type VariantGroupNode = { type: "variantGroup"; id: string; name: string; transform: Transform; default: string; children: Variant[]; }; export type Node = KeyNode | ComponentNode | ClusterNode | VariantGroupNode; export type PhyFile = { version: string; metadata: { name?: string; author?: string; description?: string; created?: string; modified?: string }; profiles: Profile[]; root: Node[]; kleCompatibility?: KleCompatibility; }; export type FlatKey = { key: KeyNode; x: number; y: number; rotation: number; path: string[] };