card-gate-frame 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core-DzM1ds_q.js +2536 -0
- package/dist/core-DzM1ds_q.js.map +1 -0
- package/dist/index-B0WElJq8.d.ts +142 -0
- package/dist/index-B0WElJq8.d.ts.map +1 -0
- package/dist/index.d.ts +143 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +728 -0
- package/dist/index.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-DzM1ds_q.js","names":["COORDINATE_SCALE","normalizeDimensions","normalizeSeed","generateGate","sampler","sampleKeyBytes","sampleUint32","sampleScalar","sampleIndex","requirePlainObject","sampleIndex","sampleIndexV2","sampleIndexV3","sampleIndex","sampleScalar","generateCourtyardV1"],"sources":["../src/core/geometry-utils.ts","../src/core/utf8.ts","../src/core/courtyard.ts","../src/core/labelled-sampler.ts","../src/core/v2/sampler.ts","../src/core/v3/sampler.ts","../src/core/family-options.ts","../src/core/v2/generate.ts","../src/core/v3/generate.ts","../src/core/dispatch.ts","../src/core/svg.ts"],"sourcesContent":["import type { GatePath, GatePathCommand } from \"./types.js\";\n\nconst COORDINATE_SCALE = 10_000;\n\nexport const canonicalNumber = (value: number): number => {\n const rounded = Math.round(value * COORDINATE_SCALE) / COORDINATE_SCALE;\n return Object.is(rounded, -0) ? 0 : rounded;\n};\n\nexport const canonicalizeCommand = (command: GatePathCommand): GatePathCommand => {\n switch (command.kind) {\n case \"M\":\n case \"L\":\n return { kind: command.kind, x: canonicalNumber(command.x), y: canonicalNumber(command.y) };\n case \"C\":\n return {\n kind: \"C\",\n x1: canonicalNumber(command.x1),\n y1: canonicalNumber(command.y1),\n x2: canonicalNumber(command.x2),\n y2: canonicalNumber(command.y2),\n x: canonicalNumber(command.x),\n y: canonicalNumber(command.y),\n };\n case \"Q\":\n return {\n kind: \"Q\",\n x1: canonicalNumber(command.x1),\n y1: canonicalNumber(command.y1),\n x: canonicalNumber(command.x),\n y: canonicalNumber(command.y),\n };\n case \"Z\":\n return { kind: \"Z\" };\n }\n};\n\nexport const canonicalizePath = (path: GatePath): GatePath => path.map(canonicalizeCommand);\n\nexport const mirrorCommand = (command: GatePathCommand, width: number): GatePathCommand => {\n switch (command.kind) {\n case \"M\":\n case \"L\":\n return { kind: command.kind, x: canonicalNumber(width - command.x), y: command.y };\n case \"C\":\n return {\n kind: \"C\",\n x1: canonicalNumber(width - command.x1),\n y1: command.y1,\n x2: canonicalNumber(width - command.x2),\n y2: command.y2,\n x: canonicalNumber(width - command.x),\n y: command.y,\n };\n case \"Q\":\n return {\n kind: \"Q\",\n x1: canonicalNumber(width - command.x1),\n y1: command.y1,\n x: canonicalNumber(width - command.x),\n y: command.y,\n };\n case \"Z\":\n return { kind: \"Z\" };\n }\n};\n\nexport const mirrorPath = (path: GatePath, width: number): GatePath =>\n path.map((command) => mirrorCommand(command, width));\n\nexport const deepFreeze = <Value>(value: Value): Value => {\n if (value !== null && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const nested of Object.values(value as Record<string, unknown>)) deepFreeze(nested);\n Object.freeze(value);\n }\n return value;\n};\n","interface Utf8Encoder {\n encode(value: string): Uint8Array;\n}\n\ntype Utf8EncoderConstructor = new () => Utf8Encoder;\n\nconst Encoder = (globalThis as unknown as { readonly TextEncoder: Utf8EncoderConstructor })\n .TextEncoder;\nconst encoder = new Encoder();\n\nexport const encodeUtf8 = (value: string): Uint8Array => encoder.encode(value);\n","import { canonicalizePath, canonicalNumber, deepFreeze, mirrorPath } from \"./geometry-utils.js\";\nimport type {\n GateDimensions,\n GateGenerationOptions,\n GateGeometry,\n GatePath,\n GateSeed,\n} from \"./types.js\";\nimport { encodeUtf8 } from \"./utf8.js\";\n\nconst DEFAULT_INSET = 8;\nconst DEFAULT_STROKE_WIDTH = 2;\nconst DEFAULT_DENSITY = 0.55;\nconst DEFAULT_CURVATURE = 0.65;\n\nconst normalizeDimensions = (dimensions: GateDimensions): GateDimensions => {\n const { width, height } = dimensions;\n\n if (!Number.isFinite(width) || !Number.isFinite(height)) {\n throw new TypeError(\"Gate dimensions must be finite numbers\");\n }\n\n if (width < 160 || width > 1_600 || height < 96 || height > 1_200) {\n throw new RangeError(\"Gate dimensions are outside the supported range\");\n }\n\n const aspectRatio = width / height;\n if (aspectRatio < 0.5 || aspectRatio > 6) {\n throw new RangeError(\"Gate dimensions have an unsupported aspect ratio\");\n }\n\n return {\n width: canonicalNumber(width),\n height: canonicalNumber(height),\n };\n};\n\nconst normalizeSeed = (seed: GateSeed): GateSeed => {\n if (typeof seed === \"number\") {\n if (!Number.isFinite(seed)) {\n throw new TypeError(\"Gate seed numbers must be finite\");\n }\n return Object.is(seed, -0) ? 0 : seed;\n }\n\n if (typeof seed !== \"string\") {\n throw new TypeError(\"Gate seeds must be strings or finite numbers\");\n }\n\n if (seed.length === 0) {\n throw new TypeError(\"Gate seed strings must not be empty\");\n }\n\n return seed;\n};\n\nconst validateGenerationOptions = (options: GateGenerationOptions): void => {\n if (options.family !== \"courtyard\") {\n throw new TypeError('GF-01 requires family: \"courtyard\"');\n }\n\n if (options.generationVersion !== undefined && options.generationVersion !== 1) {\n throw new TypeError(\"GF-01 supports only generationVersion 1\");\n }\n};\n\nconst normalizeShapeControl = (\n value: number | undefined,\n fallback: number,\n name: \"density\" | \"curvature\",\n): number => {\n const normalized = value === undefined ? fallback : value;\n\n if (!Number.isFinite(normalized)) {\n throw new TypeError(`${name} must be a finite number`);\n }\n\n if (normalized < 0 || normalized > 1) {\n throw new RangeError(`${name} must be between 0 and 1 inclusive`);\n }\n\n return canonicalNumber(normalized);\n};\n\nconst hashByte = (hash: number, byte: number): number => Math.imul(hash ^ byte, 0x01000193) >>> 0;\n\nconst hashUtf8 = (value: string): number => {\n let hash = 0x811c9dc5;\n for (const byte of encodeUtf8(value)) hash = hashByte(hash, byte);\n return hash;\n};\n\nconst seedState = (seed: GateSeed): number =>\n hashUtf8(`${typeof seed === \"number\" ? \"number\" : \"string\"}:${String(seed)}`);\n\nconst nextUint32 = (state: number): number => {\n let next = state || 0x6d2b79f5;\n next ^= next << 13;\n next ^= next >>> 17;\n next ^= next << 5;\n return next >>> 0;\n};\n\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptions,\n): Readonly<GateGeometry> {\n validateGenerationOptions(options);\n const { width, height } = normalizeDimensions(dimensions);\n const seed = normalizeSeed(options.seed);\n const density = normalizeShapeControl(options.density, DEFAULT_DENSITY, \"density\");\n const curvature = normalizeShapeControl(options.curvature, DEFAULT_CURVATURE, \"curvature\");\n const halfStroke = DEFAULT_STROKE_WIDTH / 2;\n const edge = canonicalNumber(DEFAULT_INSET + halfStroke);\n const railY = canonicalNumber(Math.max(edge + 24, height * 0.275));\n const bottomY = canonicalNumber(height - edge);\n const frameBand = canonicalNumber(Math.max(12, Math.min(24, Math.min(width, height) * 0.06)));\n const safeLeft = canonicalNumber(edge + frameBand);\n const safeRight = canonicalNumber(width - safeLeft);\n const safeTop = canonicalNumber(railY + frameBand);\n const safeBottom = canonicalNumber(bottomY - frameBand);\n const centerX = canonicalNumber(width / 2);\n\n const surfacePath: GatePath = [\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: width - edge, y: railY },\n { kind: \"L\", x: width - edge, y: bottomY },\n { kind: \"L\", x: edge, y: bottomY },\n { kind: \"Z\" },\n { kind: \"M\", x: safeLeft, y: safeTop },\n { kind: \"L\", x: safeLeft, y: safeBottom },\n { kind: \"L\", x: safeRight, y: safeBottom },\n { kind: \"L\", x: safeRight, y: safeTop },\n { kind: \"Z\" },\n ];\n\n const structuralPath: GatePath = [\n { kind: \"M\", x: edge, y: bottomY },\n { kind: \"L\", x: edge, y: railY },\n { kind: \"L\", x: width - edge, y: railY },\n { kind: \"L\", x: width - edge, y: bottomY },\n { kind: \"Z\" },\n ];\n\n const seedVariation = nextUint32(seedState(seed)) / 0xffffffff;\n const availableScrollLift = canonicalNumber(railY - edge - 4);\n const scrollLift = canonicalNumber(Math.min(availableScrollLift, 27 + seedVariation * 6));\n const scrollStart = safeLeft;\n const availableScrollReach = canonicalNumber(centerX - 24 - scrollStart);\n const baseScrollReach = Math.min(width * 0.22, 66 + seedVariation * 8, availableScrollReach);\n const scrollReach = canonicalNumber(baseScrollReach * (0.86 + density * 0.14));\n const scrollEnd = canonicalNumber(scrollStart + scrollReach);\n const curvatureScale = 0.8 + curvature * 0.3;\n const leftScroll: GatePath = [\n { kind: \"M\", x: scrollStart, y: railY },\n {\n kind: \"C\",\n x1: scrollStart + 5 * curvatureScale,\n y1: railY - 20 * curvatureScale,\n x2: scrollEnd - 18 * curvatureScale,\n y2: railY - scrollLift,\n x: scrollEnd,\n y: railY - scrollLift,\n },\n {\n kind: \"C\",\n x1: scrollEnd + 18 * curvatureScale,\n y1: railY - scrollLift,\n x2: scrollEnd + 22 * curvatureScale,\n y2: railY - 9 * curvatureScale,\n x: scrollEnd + 10,\n y: railY - 6,\n },\n {\n kind: \"C\",\n x1: scrollEnd,\n y1: railY - 3,\n x2: scrollEnd - 8 * curvatureScale,\n y2: railY - 10 * curvatureScale,\n x: scrollEnd - 3,\n y: railY - 16,\n },\n ];\n\n const spear: GatePath = [\n { kind: \"M\", x: centerX, y: railY },\n { kind: \"L\", x: centerX, y: edge + 18 },\n { kind: \"M\", x: centerX, y: edge },\n { kind: \"L\", x: centerX + 7, y: edge + 12 },\n { kind: \"L\", x: centerX, y: edge + 19 },\n { kind: \"L\", x: centerX - 7, y: edge + 12 },\n { kind: \"Z\" },\n ];\n\n const geometry: GateGeometry = {\n schemaVersion: 1,\n generationVersion: 1,\n seed,\n dimensions: { width, height },\n viewBox: { minX: 0, minY: 0, width, height },\n options: {\n generationVersion: 1,\n family: \"courtyard\",\n density,\n curvature,\n symmetry: 1,\n crest: \"spear\",\n inset: DEFAULT_INSET,\n strokeWidth: DEFAULT_STROKE_WIDTH,\n },\n bounds: {\n left: edge,\n right: canonicalNumber(width - edge),\n railY,\n bottomY,\n },\n contentInsets: {\n top: safeTop,\n right: canonicalNumber(width - safeRight),\n bottom: canonicalNumber(height - safeBottom),\n left: safeLeft,\n },\n surfacePath: canonicalizePath(surfacePath),\n structuralPaths: [canonicalizePath(structuralPath)],\n decorativePaths: [\n canonicalizePath(leftScroll),\n mirrorPath(canonicalizePath(leftScroll), width),\n canonicalizePath(spear),\n ],\n };\n\n return deepFreeze(geometry);\n}\n","import type { GateSeed } from \"./types.js\";\nimport { encodeUtf8 } from \"./utf8.js\";\n\nexport interface LabelledSampler {\n sampleKeyBytes(seed: GateSeed, label: string, index?: number): Uint8Array;\n sampleUint32(seed: GateSeed, label: string, index?: number): number;\n sampleScalar(seed: GateSeed, label: string, index?: number): number;\n sampleIndex(seed: GateSeed, label: string, count: number, index?: number): number;\n}\n\nexport function createLabelledSampler(version: 2 | 3): LabelledSampler {\n const UINT32_RANGE = 4_294_967_296;\n const SAMPLE_DOMAIN = `gate-frame/v${version}/sample\\0`;\n const LABEL_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*)*$/;\n\n const pushUint32Le = (bytes: number[], value: number): void => {\n bytes.push(value & 0xff, (value >>> 8) & 0xff, (value >>> 16) & 0xff, value >>> 24);\n };\n\n function sampleKeyBytes(seed: GateSeed, label: string, index?: number): Uint8Array {\n if (typeof seed === \"number\" && !Number.isFinite(seed)) {\n throw new TypeError(\"Sample seed numbers must be finite\");\n }\n if (typeof seed !== \"string\" && typeof seed !== \"number\") {\n throw new TypeError(\"Sample seeds must be strings or finite numbers\");\n }\n if (!LABEL_PATTERN.test(label)) {\n throw new TypeError(`Sample labels must use the generation-v${version} labelled domain`);\n }\n if (index !== undefined && (!Number.isInteger(index) || index < 0 || index > 0xffff_ffff)) {\n throw new RangeError(\"Sample indices must be unsigned 32-bit integers\");\n }\n\n const normalizedSeed = typeof seed === \"number\" && Object.is(seed, -0) ? 0 : seed;\n const seedBytes = encodeUtf8(String(normalizedSeed));\n const labelBytes = encodeUtf8(label);\n const bytes = Array.from(encodeUtf8(SAMPLE_DOMAIN));\n bytes.push(typeof normalizedSeed === \"number\" ? 0x6e : 0x73);\n pushUint32Le(bytes, seedBytes.length);\n bytes.push(...seedBytes);\n pushUint32Le(bytes, labelBytes.length);\n bytes.push(...labelBytes);\n bytes.push(index === undefined ? 0 : 1);\n if (index !== undefined) {\n pushUint32Le(bytes, index);\n }\n return Uint8Array.from(bytes);\n }\n\n function sampleUint32(seed: GateSeed, label: string, index?: number): number {\n let hash = 0x811c9dc5;\n for (const byte of sampleKeyBytes(seed, label, index)) {\n hash = Math.imul(hash ^ byte, 0x01000193) >>> 0;\n }\n hash ^= hash >>> 16;\n hash = Math.imul(hash, 0x85ebca6b) >>> 0;\n hash ^= hash >>> 13;\n hash = Math.imul(hash, 0xc2b2ae35) >>> 0;\n hash ^= hash >>> 16;\n return hash >>> 0;\n }\n\n function sampleScalar(seed: GateSeed, label: string, index?: number): number {\n return sampleUint32(seed, label, index) / UINT32_RANGE;\n }\n\n function sampleIndex(seed: GateSeed, label: string, count: number, index?: number): number {\n if (!Number.isInteger(count) || count < 1 || count > 65_536) {\n throw new RangeError(\"Sample counts must be integers from 1 through 65536\");\n }\n return Math.floor((sampleUint32(seed, label, index) * count) / UINT32_RANGE);\n }\n\n return { sampleKeyBytes, sampleUint32, sampleScalar, sampleIndex };\n}\n","import { createLabelledSampler, type LabelledSampler } from \"../labelled-sampler.js\";\n\nconst sampler = createLabelledSampler(2);\nexport const sampleKeyBytes: LabelledSampler[\"sampleKeyBytes\"] = sampler.sampleKeyBytes;\nexport const sampleUint32: LabelledSampler[\"sampleUint32\"] = sampler.sampleUint32;\nexport const sampleScalar: LabelledSampler[\"sampleScalar\"] = sampler.sampleScalar;\nexport const sampleIndex: LabelledSampler[\"sampleIndex\"] = sampler.sampleIndex;\n","import { createLabelledSampler, type LabelledSampler } from \"../labelled-sampler.js\";\n\nconst sampler = createLabelledSampler(3);\nexport const sampleKeyBytes: LabelledSampler[\"sampleKeyBytes\"] = sampler.sampleKeyBytes;\nexport const sampleUint32: LabelledSampler[\"sampleUint32\"] = sampler.sampleUint32;\nexport const sampleScalar: LabelledSampler[\"sampleScalar\"] = sampler.sampleScalar;\nexport const sampleIndex: LabelledSampler[\"sampleIndex\"] = sampler.sampleIndex;\n","import { canonicalNumber } from \"./geometry-utils.js\";\nimport type {\n GateCrest,\n GateDimensions,\n GateFamily,\n GateGenerationOptionsV2,\n GateGenerationOptionsV3,\n GateSeed,\n NormalizedGateGenerationOptionsV2,\n NormalizedGateGenerationOptionsV3,\n} from \"./types.js\";\nimport { sampleIndex as sampleIndexV2 } from \"./v2/sampler.js\";\nimport { sampleIndex as sampleIndexV3 } from \"./v3/sampler.js\";\n\nconst INSET = 8 as const;\nconst STROKE_WIDTH = 2 as const;\nconst FAMILY_ORDER: readonly GateFamily[] = [\n \"courtyard\",\n \"fleuron\",\n \"arcade\",\n \"vine\",\n \"fan\",\n \"volute\",\n];\nconst SPEAR_DIAMOND_CRESTS = [\"spear\", \"diamond\", \"none\"] as const;\nconst FLEUR_SPEAR_CRESTS = [\"fleur\", \"spear\", \"none\"] as const;\nconst DIAMOND_SPEAR_CRESTS = [\"diamond\", \"spear\", \"none\"] as const;\nconst FLEUR_DIAMOND_CRESTS = [\"fleur\", \"diamond\", \"none\"] as const;\n\nexport const isGateFamily = (value: unknown): value is GateFamily =>\n typeof value === \"string\" && FAMILY_ORDER.includes(value as GateFamily);\n\nexport const compatibleCrestsForFamily = (family: GateFamily): ReadonlyArray<GateCrest> =>\n family === \"courtyard\"\n ? SPEAR_DIAMOND_CRESTS\n : family === \"vine\"\n ? FLEUR_DIAMOND_CRESTS\n : family === \"arcade\" || family === \"fan\"\n ? DIAMOND_SPEAR_CRESTS\n : FLEUR_SPEAR_CRESTS;\n\nexport const isCompatibleCrest = (family: unknown, crest: unknown): boolean =>\n isGateFamily(family) && compatibleCrestsForFamily(family).includes(crest as GateCrest);\nconst FAMILY_OPTION_KEYS = new Set([\n \"seed\",\n \"generationVersion\",\n \"family\",\n \"density\",\n \"curvature\",\n \"symmetry\",\n \"peakHeight\",\n \"sideComplexity\",\n \"crest\",\n]);\n\nconst requirePlainObject = (value: unknown, version: 2 | 3): Record<string, unknown> => {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(`generation-v${version} options must be a plain object`);\n }\n return value as Record<string, unknown>;\n};\n\nconst ownValue = (input: Record<string, unknown>, key: string): unknown =>\n Object.hasOwn(input, key) ? input[key] : undefined;\n\nexport const normalizeDimensions = (dimensions: GateDimensions): GateDimensions => {\n if (dimensions === null || typeof dimensions !== \"object\") {\n throw new TypeError(\"Gate dimensions must be a plain object\");\n }\n const { width, height } = dimensions;\n if (!Number.isFinite(width) || !Number.isFinite(height)) {\n throw new TypeError(\"Gate dimensions must be finite numbers\");\n }\n if (width < 160 || width > 1_600 || height < 96 || height > 1_200) {\n throw new RangeError(\"Gate dimensions are outside the supported range\");\n }\n const aspectRatio = width / height;\n if (aspectRatio < 0.5 || aspectRatio > 6) {\n throw new RangeError(\"Gate dimensions have an unsupported aspect ratio\");\n }\n return { width: canonicalNumber(width), height: canonicalNumber(height) };\n};\n\nconst normalizeSeed = (value: unknown): GateSeed => {\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(\"Gate seed numbers must be finite\");\n }\n return Object.is(value, -0) ? 0 : value;\n }\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(\"Gate seeds must be non-empty strings or finite numbers\");\n }\n return value;\n};\n\nconst normalizeControl = (value: unknown, fallback: number, name: string): number => {\n const candidate = value === undefined ? fallback : value;\n if (typeof candidate !== \"number\" || !Number.isFinite(candidate)) {\n throw new TypeError(`${name} must be a finite number`);\n }\n if (candidate < 0 || candidate > 1) {\n throw new RangeError(`${name} must be between 0 and 1 inclusive`);\n }\n return canonicalNumber(candidate);\n};\n\nexport function normalizeFamilyOptions(\n value: GateGenerationOptionsV2,\n version: 2,\n): { readonly seed: GateSeed; readonly options: NormalizedGateGenerationOptionsV2 };\nexport function normalizeFamilyOptions(\n value: GateGenerationOptionsV3,\n version: 3,\n): { readonly seed: GateSeed; readonly options: NormalizedGateGenerationOptionsV3 };\nexport function normalizeFamilyOptions(\n value: GateGenerationOptionsV2 | GateGenerationOptionsV3,\n version: 2 | 3,\n): {\n readonly seed: GateSeed;\n readonly options: NormalizedGateGenerationOptionsV2 | NormalizedGateGenerationOptionsV3;\n} {\n const sampleIndex = version === 2 ? sampleIndexV2 : sampleIndexV3;\n const input = requirePlainObject(value, version);\n const unsupportedKeys = Reflect.ownKeys(input)\n .filter((key) => typeof key !== \"string\" || !FAMILY_OPTION_KEYS.has(key))\n .map(String)\n .sort();\n if (unsupportedKeys.length > 0) {\n throw new TypeError(\n `Unsupported generation-v${version} option keys: ${unsupportedKeys.join(\", \")}`,\n );\n }\n if (ownValue(input, \"generationVersion\") !== version) {\n throw new TypeError(`generation-v${version} options require generationVersion ${version}`);\n }\n\n const seed = normalizeSeed(ownValue(input, \"seed\"));\n const familyInput = ownValue(input, \"family\");\n const requestedFamily = familyInput === undefined ? \"auto\" : familyInput;\n if (requestedFamily !== \"auto\" && !isGateFamily(requestedFamily)) {\n throw new TypeError(`generation-v${version} family is invalid`);\n }\n const family =\n requestedFamily === \"auto\"\n ? (FAMILY_ORDER[sampleIndex(seed, \"family\", FAMILY_ORDER.length)] as GateFamily)\n : (requestedFamily as GateFamily);\n\n const density = normalizeControl(ownValue(input, \"density\"), 0.55, \"density\");\n const curvature = normalizeControl(ownValue(input, \"curvature\"), 0.65, \"curvature\");\n const symmetry = normalizeControl(ownValue(input, \"symmetry\"), 1, \"symmetry\");\n const peakHeight = normalizeControl(ownValue(input, \"peakHeight\"), 0.35, \"peakHeight\");\n const sideComplexity = normalizeControl(ownValue(input, \"sideComplexity\"), 0.5, \"sideComplexity\");\n const requestedCrest = ownValue(input, \"crest\");\n const compatibleCrests = compatibleCrestsForFamily(family);\n if (\n requestedCrest !== undefined &&\n (typeof requestedCrest !== \"string\" || !compatibleCrests.includes(requestedCrest as never))\n ) {\n throw new TypeError(`crest is incompatible with generation-v${version} family ${family}`);\n }\n const crest =\n requestedCrest === undefined\n ? (compatibleCrests[\n version === 3 ? 0 : sampleIndex(seed, `${family}/crest`, compatibleCrests.length)\n ] as GateCrest)\n : (requestedCrest as NormalizedGateGenerationOptionsV2[\"crest\"]);\n\n return {\n seed,\n options: {\n generationVersion: version,\n family,\n density,\n curvature,\n symmetry,\n peakHeight,\n sideComplexity,\n crest,\n inset: INSET,\n strokeWidth: STROKE_WIDTH,\n },\n };\n}\n","import { normalizeDimensions, normalizeFamilyOptions } from \"../family-options.js\";\n\nexport { compatibleCrestsForFamily, isCompatibleCrest, isGateFamily } from \"../family-options.js\";\n\nimport { canonicalizePath, canonicalNumber, deepFreeze, mirrorPath } from \"../geometry-utils.js\";\nimport type {\n GateDimensions,\n GateGenerationOptionsV2,\n GateGeometryV2,\n GatePath,\n GateSeed,\n NormalizedGateGenerationOptionsV2,\n} from \"../types.js\";\nimport { sampleIndex, sampleScalar } from \"./sampler.js\";\n\nconst INSET = 8 as const;\nconst STROKE_WIDTH = 2 as const;\nconst COORDINATE_SCALE = 10_000;\nconst centerPairForWidth = (width: number): Readonly<{ left: number; right: number }> => {\n const widthLatticeUnits = Math.round(width * COORDINATE_SCALE);\n const leftLatticeUnits = Math.floor(widthLatticeUnits / 2);\n return {\n left: leftLatticeUnits / COORDINATE_SCALE,\n right: (widthLatticeUnits - leftLatticeUnits) / COORDINATE_SCALE,\n };\n};\n\nconst pairedCenteredPaths = (path: GatePath, width: number): GatePath[] => {\n const centerPair = centerPairForWidth(width);\n return centerPair.left === centerPair.right ? [path] : [path, mirrorPath(path, width)];\n};\n\nconst displaceInteriorY = (path: GatePath, displacement: number): GatePath =>\n canonicalizePath(\n path.map((command, index) => {\n if (command.kind === \"C\") {\n return {\n ...command,\n y1: command.y1 + displacement,\n y2: command.y2 + displacement,\n };\n }\n if (command.kind === \"Q\") {\n return { ...command, y1: command.y1 + displacement };\n }\n if (command.kind === \"L\" && index < path.length - 1) {\n return { ...command, y: command.y + displacement };\n }\n return command;\n }),\n );\n\nconst quantizedSymmetryDisplacement = (\n symmetry: number,\n signedSample: number,\n maximumSpan: number,\n): number => {\n if (symmetry === 1) return 0;\n const maximumLatticeUnits = Math.max(1, Math.floor((maximumSpan * COORDINATE_SCALE) / 2));\n const sampledLatticeUnits = Math.round(\n (1 - symmetry) * signedSample * maximumSpan * COORDINATE_SCALE,\n );\n const direction = signedSample < 0 ? -1 : 1;\n const magnitude = Math.min(maximumLatticeUnits, Math.max(1, Math.abs(sampledLatticeUnits)));\n return (direction * magnitude) / COORDINATE_SCALE;\n};\n\nconst createCrestPath = (\n crest: NormalizedGateGenerationOptionsV2[\"crest\"],\n centerX: number,\n edge: number,\n railY: number,\n peakHeight: number,\n): GatePath | undefined => {\n if (crest === \"none\") {\n return undefined;\n }\n const upperHeight = railY - edge;\n const tipY = edge;\n const shoulderY = canonicalNumber(edge + Math.min(18, upperHeight * (0.28 + peakHeight * 0.16)));\n const halfWidth = canonicalNumber(Math.min(8, upperHeight * 0.18));\n if (crest === \"spear\") {\n return canonicalizePath([\n { kind: \"M\", x: centerX, y: railY },\n { kind: \"L\", x: centerX, y: tipY },\n { kind: \"M\", x: centerX, y: tipY },\n { kind: \"L\", x: centerX + halfWidth, y: shoulderY },\n { kind: \"L\", x: centerX, y: shoulderY + halfWidth },\n { kind: \"L\", x: centerX - halfWidth, y: shoulderY },\n { kind: \"Z\" },\n ]);\n }\n if (crest === \"fleur\") {\n const crestHeight = canonicalNumber(upperHeight * (0.44 + peakHeight * 0.04));\n const crestTopY = canonicalNumber(railY - crestHeight);\n const sidePetalHalfWidth = canonicalNumber(crestHeight * 0.39);\n const collarHalfWidth = canonicalNumber(crestHeight * 0.26);\n const centralPetalHalfWidth = canonicalNumber(crestHeight * 0.18);\n const lowerSepalHalfWidth = canonicalNumber(crestHeight * 0.37);\n const sidePetalY = canonicalNumber(crestTopY + crestHeight * 0.38);\n const collarY = canonicalNumber(crestTopY + crestHeight * 0.7);\n const centralPetal = canonicalizePath([\n { kind: \"M\", x: centerX, y: collarY },\n {\n kind: \"C\",\n x1: centerX - centralPetalHalfWidth,\n y1: crestTopY + crestHeight * 0.52,\n x2: centerX - centralPetalHalfWidth,\n y2: crestTopY + crestHeight * 0.16,\n x: centerX,\n y: crestTopY,\n },\n {\n kind: \"C\",\n x1: centerX + centralPetalHalfWidth,\n y1: crestTopY + crestHeight * 0.16,\n x2: centerX + centralPetalHalfWidth,\n y2: crestTopY + crestHeight * 0.52,\n x: centerX,\n y: collarY,\n },\n { kind: \"Z\" },\n ]);\n const leftSidePetal = canonicalizePath([\n { kind: \"M\", x: centerX, y: collarY },\n {\n kind: \"C\",\n x1: centerX - collarHalfWidth * 0.35,\n y1: crestTopY + crestHeight * 0.56,\n x2: centerX - sidePetalHalfWidth * 0.72,\n y2: crestTopY + crestHeight * 0.23,\n x: centerX - sidePetalHalfWidth,\n y: sidePetalY,\n },\n {\n kind: \"C\",\n x1: centerX - sidePetalHalfWidth * 1.02,\n y1: crestTopY + crestHeight * 0.52,\n x2: centerX - collarHalfWidth * 1.25,\n y2: crestTopY + crestHeight * 0.66,\n x: centerX - collarHalfWidth,\n y: collarY,\n },\n ]);\n const leftSepal = canonicalizePath([\n { kind: \"M\", x: centerX - collarHalfWidth, y: collarY },\n {\n kind: \"C\",\n x1: centerX - lowerSepalHalfWidth,\n y1: crestTopY + crestHeight * 0.79,\n x2: centerX - lowerSepalHalfWidth,\n y2: crestTopY + crestHeight * 0.91,\n x: centerX,\n y: railY,\n },\n ]);\n return canonicalizePath([\n { kind: \"M\", x: centerX, y: railY },\n { kind: \"L\", x: centerX, y: collarY },\n ...leftSidePetal,\n ...mirrorPath(leftSidePetal, centerX * 2),\n { kind: \"M\", x: centerX - collarHalfWidth, y: collarY },\n { kind: \"L\", x: centerX + collarHalfWidth, y: collarY },\n ...leftSepal,\n ...mirrorPath(leftSepal, centerX * 2),\n ...centralPetal,\n ]);\n }\n return canonicalizePath([\n { kind: \"M\", x: centerX, y: railY },\n { kind: \"L\", x: centerX, y: tipY },\n { kind: \"M\", x: centerX, y: tipY },\n { kind: \"L\", x: centerX + halfWidth, y: shoulderY },\n { kind: \"L\", x: centerX, y: shoulderY + halfWidth * 2 },\n { kind: \"L\", x: centerX - halfWidth, y: shoulderY },\n { kind: \"Z\" },\n ]);\n};\n\ntype ComposedFamilyPaths = Readonly<{\n structural: GatePath[];\n decorative: GatePath[];\n}>;\n\nconst composeCourtyard = (\n seed: GateSeed,\n options: NormalizedGateGenerationOptionsV2,\n layout: Readonly<{\n width: number;\n edge: number;\n railY: number;\n bottomY: number;\n frameBand: number;\n safeLeft: number;\n }>,\n): ComposedFamilyPaths => {\n const { width, edge, railY, bottomY, frameBand, safeLeft } = layout;\n const composition = sampleIndex(seed, \"courtyard/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"courtyard/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"courtyard/sides\")),\n );\n const scrollPairs = [1, 2, 3][motifLevel] as number;\n\n const upperHeight = railY - edge;\n const halfSpan = width / 2 - edge;\n const scrollReach = canonicalNumber(\n halfSpan * (0.42 + 0.26 * sampleScalar(seed, \"courtyard/anchor/scroll-reach\")),\n );\n const lift = canonicalNumber(\n upperHeight * (0.42 + options.curvature * 0.18 + options.peakHeight * 0.12),\n );\n const structural: GatePath[] = [];\n\n if (composition === 1) {\n const bayWidth = (width - edge * 2) / 3;\n for (let index = 0; index < 3; index += 1) {\n const left = canonicalNumber(edge + bayWidth * index);\n const right = canonicalNumber(edge + bayWidth * (index + 1));\n const bayLift = canonicalNumber(lift * (index === 1 ? 1 : 0.72));\n const bayPath = canonicalizePath([\n { kind: \"M\", x: left, y: railY },\n { kind: \"Q\", x1: (left + right) / 2, y1: railY - bayLift, x: right, y: railY },\n ]);\n structural.push(...(index === 1 ? pairedCenteredPaths(bayPath, width) : [bayPath]));\n }\n const centerPair = centerPairForWidth(width);\n if (centerPair.left !== centerPair.right) {\n const leftBay = structural[0] as GatePath;\n structural[structural.length - 1] = mirrorPath(leftBay, width);\n }\n } else if (composition === 2) {\n const shoulder = canonicalNumber(width / 2 - Math.min(scrollReach * 0.38, halfSpan * 0.34));\n const crownY = canonicalNumber(edge + upperHeight * (0.28 - options.peakHeight * 0.08));\n const bridgePath = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: shoulder, y: railY - lift * 0.48 },\n { kind: \"Q\", x1: width / 2, y1: crownY, x: width - shoulder, y: railY - lift * 0.48 },\n { kind: \"L\", x: width - edge, y: railY },\n ]);\n structural.push(...pairedCenteredPaths(bridgePath, width));\n const centerStem = canonicalizePath([\n { kind: \"M\", x: width / 2, y: railY },\n { kind: \"L\", x: width / 2, y: crownY },\n ]);\n structural.push(...pairedCenteredPaths(centerStem, width));\n }\n\n for (let index = 0; index < scrollPairs; index += 1) {\n const nesting = 1 - index * 0.17;\n const startX = canonicalNumber(edge + index * Math.min(5, frameBand * 0.22));\n const endX = canonicalNumber(edge + scrollReach * nesting);\n const scrollLift = canonicalNumber(lift * nesting);\n const leftScroll = canonicalizePath([\n { kind: \"M\", x: startX, y: railY },\n {\n kind: \"C\",\n x1: startX + (endX - startX) * 0.18,\n y1: railY - scrollLift * 0.52,\n x2: startX + (endX - startX) * 0.54,\n y2: railY - scrollLift,\n x: endX,\n y: railY - scrollLift * 0.58,\n },\n {\n kind: \"C\",\n x1: endX + (endX - startX) * 0.08,\n y1: railY - scrollLift * 0.26,\n x2: endX - (endX - startX) * 0.12,\n y2: railY - scrollLift * 0.08,\n x: endX - (endX - startX) * 0.28,\n y: railY,\n },\n ]);\n const rightDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"courtyard/detail\", index) - 0.5,\n lift * 0.08,\n );\n structural.push(\n leftScroll,\n displaceInteriorY(mirrorPath(leftScroll, width), rightDisplacement),\n );\n }\n\n const sideMiddle = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 1.0001);\n const leftSide =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.52, y: sideMiddle },\n { kind: \"L\", x: edge, y: bottomY },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: railY + (sideMiddle - railY) * 0.42,\n x2: edge + sideReach,\n y2: sideMiddle - frameBand * 0.35,\n x: edge + sideReach * 0.5,\n y: sideMiddle,\n },\n {\n kind: \"C\",\n x1: edge,\n y1: sideMiddle + frameBand * 0.35,\n x2: edge,\n y2: bottomY - (bottomY - sideMiddle) * 0.42,\n x: edge,\n y: bottomY,\n },\n ]);\n const decorative = [leftSide, mirrorPath(leftSide, width)];\n\n return { structural, decorative };\n};\n\nconst composeFleuron = (\n seed: GateSeed,\n options: NormalizedGateGenerationOptionsV2,\n layout: Readonly<{\n width: number;\n edge: number;\n railY: number;\n bottomY: number;\n frameBand: number;\n safeLeft: number;\n }>,\n): ComposedFamilyPaths => {\n const { width, edge, railY, bottomY, frameBand, safeLeft } = layout;\n const composition = sampleIndex(seed, \"fleuron/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"fleuron/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"fleuron/sides\")),\n );\n const clusterCount = [1, 2, 3][motifLevel] as number;\n\n const upperHeight = railY - edge;\n const upperRight = canonicalNumber(width - edge);\n const upperWidth = canonicalNumber(upperRight - edge);\n const petalSpan = canonicalNumber(\n upperWidth * (0.12 + 0.1 * sampleScalar(seed, \"fleuron/proportion/petal-span\")),\n );\n const lift = canonicalNumber(\n upperHeight * (0.5 + options.curvature * 0.16 + options.peakHeight * 0.16),\n );\n const centerX = width / 2;\n const structural: GatePath[] = [];\n const clusterTier = (index: number): number => Math.min(index, clusterCount - 1 - index) % 2;\n\n if (composition === 0) {\n const leftBrace = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + petalSpan * 0.3,\n y1: railY - lift * 0.5,\n x2: centerX - petalSpan,\n y2: railY - lift,\n x: centerX,\n y: railY - lift * 0.58,\n },\n {\n kind: \"C\",\n x1: centerX - petalSpan * 0.3,\n y1: railY - lift * 0.34,\n x2: centerX - petalSpan * 0.18,\n y2: railY - lift * 0.12,\n x: centerX,\n y: railY,\n },\n ]);\n structural.push(leftBrace, mirrorPath(leftBrace, width));\n const centerStem = canonicalizePath([\n { kind: \"M\", x: centerX, y: railY },\n { kind: \"L\", x: centerX, y: edge + upperHeight * 0.2 },\n ]);\n structural.push(...pairedCenteredPaths(centerStem, width));\n } else if (composition === 1) {\n const heartPath = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + petalSpan * 0.55,\n y1: railY - lift * 0.58,\n x2: centerX - petalSpan * 0.72,\n y2: railY - lift,\n x: centerX,\n y: railY - lift * 0.42,\n },\n {\n kind: \"C\",\n x1: centerX + petalSpan * 0.72,\n y1: railY - lift,\n x2: width - edge - petalSpan * 0.55,\n y2: railY - lift * 0.58,\n x: width - edge,\n y: railY,\n },\n ]);\n structural.push(...pairedCenteredPaths(heartPath, width));\n }\n\n const decorative: GatePath[] = [];\n const stemPairSources = new Map<number, GatePath>();\n const petalPairSources = new Map<number, GatePath>();\n for (let index = 0; index < clusterCount; index += 1) {\n const mirrorIndex = clusterCount - 1 - index;\n if (index > mirrorIndex) {\n const stemSource = stemPairSources.get(mirrorIndex) as GatePath;\n const source = petalPairSources.get(mirrorIndex) as GatePath;\n structural.push(mirrorPath(stemSource, width));\n decorative.push(mirrorPath(source, width));\n continue;\n }\n const offset = (index - (clusterCount - 1) / 2) * petalSpan * 0.72;\n const rootX = canonicalNumber(centerX + offset * 1.45);\n const flowerX = canonicalNumber(centerX + offset);\n const flowerY = canonicalNumber(railY - lift * (0.58 + (clusterTier(index) === 0 ? 0.16 : 0)));\n const halfPetal = canonicalNumber(Math.min(petalSpan * 0.22, upperHeight * 0.2));\n const stemPath = canonicalizePath([\n { kind: \"M\", x: rootX, y: railY },\n {\n kind: \"Q\",\n x1: rootX + (flowerX - rootX) * 0.35,\n y1: railY - lift * 0.36,\n x: flowerX,\n y: flowerY + halfPetal,\n },\n ]);\n const petalPath = canonicalizePath([\n { kind: \"M\", x: flowerX, y: flowerY + halfPetal },\n {\n kind: \"Q\",\n x1: flowerX - halfPetal,\n y1: flowerY,\n x: flowerX,\n y: flowerY - halfPetal,\n },\n {\n kind: \"Q\",\n x1: flowerX + halfPetal,\n y1: flowerY,\n x: flowerX,\n y: flowerY + halfPetal,\n },\n { kind: \"Z\" },\n ]);\n if (index === mirrorIndex) {\n structural.push(...pairedCenteredPaths(stemPath, width));\n decorative.push(...pairedCenteredPaths(petalPath, width));\n } else {\n stemPairSources.set(index, stemPath);\n petalPairSources.set(index, petalPath);\n structural.push(stemPath);\n decorative.push(petalPath);\n }\n }\n\n const sideMiddle = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 1.0001);\n const leftSide =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: bottomY },\n { kind: \"L\", x: edge + sideReach * 0.72, y: sideMiddle },\n { kind: \"L\", x: edge, y: railY },\n ])\n : sideLevel === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: sideMiddle + frameBand * 0.42 },\n {\n kind: \"Q\",\n x1: edge + sideReach,\n y1: sideMiddle,\n x: edge,\n y: sideMiddle - frameBand * 0.42,\n },\n {\n kind: \"Q\",\n x1: edge + sideReach * 0.45,\n y1: sideMiddle,\n x: edge,\n y: sideMiddle + frameBand * 0.42,\n },\n { kind: \"Z\" },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: railY + (sideMiddle - railY) * 0.34,\n x2: edge + sideReach,\n y2: sideMiddle - frameBand * 0.28,\n x: edge + sideReach * 0.35,\n y: sideMiddle,\n },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: sideMiddle + frameBand * 0.28,\n x2: edge + sideReach,\n y2: bottomY - (bottomY - sideMiddle) * 0.34,\n x: edge,\n y: bottomY,\n },\n ]);\n const rightSideDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"fleuron/detail\", clusterCount) - 0.5,\n frameBand * 0.12,\n );\n decorative.push(leftSide, displaceInteriorY(mirrorPath(leftSide, width), rightSideDisplacement));\n\n return { structural, decorative };\n};\n\nconst composeVine = (\n seed: GateSeed,\n options: NormalizedGateGenerationOptionsV2,\n layout: Readonly<{\n width: number;\n edge: number;\n railY: number;\n bottomY: number;\n frameBand: number;\n safeLeft: number;\n }>,\n): ComposedFamilyPaths => {\n const { width, edge, railY, bottomY, frameBand, safeLeft } = layout;\n const composition = sampleIndex(seed, \"vine/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"vine/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"vine/sides\")),\n );\n const leafPairs = [2, 4, 6][motifLevel] as number;\n const curlPairCount = [1, 1, 2][motifLevel] as number;\n\n const upperHeight = railY - edge;\n const halfSpan = width / 2 - edge;\n const leafNode = 0.22 + 0.56 * sampleScalar(seed, \"vine/anchor/leaf-node\");\n const lift = canonicalNumber(\n upperHeight * (0.52 + options.curvature * 0.16 + options.peakHeight * 0.14),\n );\n const structural: GatePath[] = [];\n\n if (composition === 0) {\n const leftStem = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + halfSpan * 0.12,\n y1: railY - lift * 0.28,\n x2: edge + halfSpan * 0.28,\n y2: railY - lift * 0.78,\n x: edge + halfSpan * 0.62,\n y: railY - lift,\n },\n {\n kind: \"C\",\n x1: edge + halfSpan * 0.78,\n y1: railY - lift * 0.96,\n x2: width / 2 - halfSpan * 0.08,\n y2: railY - lift * 0.5,\n x: width / 2,\n y: railY,\n },\n ]);\n structural.push(leftStem, mirrorPath(leftStem, width));\n } else if (composition === 1) {\n const leftCanopy = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + halfSpan * 0.18,\n y1: railY - lift * 0.72,\n x2: edge + halfSpan * 0.52,\n y2: railY - lift,\n x: width / 2,\n y: railY - lift * 0.62,\n },\n {\n kind: \"C\",\n x1: width / 2 + halfSpan * 0.18,\n y1: railY - lift * 0.38,\n x2: width / 2 + halfSpan * 0.3,\n y2: railY - lift * 0.82,\n x: width / 2 + halfSpan * 0.48,\n y: railY - lift * 0.54,\n },\n {\n kind: \"C\",\n x1: width / 2 + halfSpan * 0.62,\n y1: railY - lift * 0.3,\n x2: width - edge - halfSpan * 0.08,\n y2: railY - lift * 0.16,\n x: width - edge,\n y: railY,\n },\n ]);\n structural.push(leftCanopy, mirrorPath(leftCanopy, width));\n } else {\n const leftBranch = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + halfSpan * 0.08,\n y1: railY - lift * 0.22,\n x2: edge + halfSpan * 0.2,\n y2: railY - lift * 0.86,\n x: edge + halfSpan * 0.48,\n y: railY - lift * 0.82,\n },\n {\n kind: \"C\",\n x1: edge + halfSpan * 0.7,\n y1: railY - lift * 0.78,\n x2: width / 2 - halfSpan * 0.12,\n y2: railY - lift * 0.34,\n x: width / 2,\n y: railY - lift * 0.56,\n },\n {\n kind: \"C\",\n x1: width / 2 - halfSpan * 0.04,\n y1: railY - lift * 0.28,\n x2: width / 2 - halfSpan * 0.02,\n y2: railY - lift * 0.12,\n x: width / 2,\n y: railY,\n },\n ]);\n structural.push(leftBranch, mirrorPath(leftBranch, width));\n const centerStem = canonicalizePath([\n { kind: \"M\", x: width / 2, y: railY },\n { kind: \"L\", x: width / 2, y: railY - lift * 0.56 },\n ]);\n structural.push(...pairedCenteredPaths(centerStem, width));\n }\n\n for (let index = 0; index < curlPairCount; index += 1) {\n const rootX = canonicalNumber(edge + halfSpan * (0.16 + index * 0.11));\n const reach = canonicalNumber(halfSpan * (0.28 - index * 0.06));\n const curlLift = canonicalNumber(lift * (0.68 - index * 0.12));\n const leftCurl = canonicalizePath([\n { kind: \"M\", x: rootX, y: railY },\n {\n kind: \"C\",\n x1: rootX + reach * 0.12,\n y1: railY - curlLift * 0.48,\n x2: rootX + reach * 0.54,\n y2: railY - curlLift,\n x: rootX + reach * 0.82,\n y: railY - curlLift * 0.72,\n },\n {\n kind: \"C\",\n x1: rootX + reach * 1.08,\n y1: railY - curlLift * 0.52,\n x2: rootX + reach,\n y2: railY - curlLift * 0.18,\n x: rootX + reach * 0.76,\n y: railY - curlLift * 0.28,\n },\n {\n kind: \"C\",\n x1: rootX + reach * 0.56,\n y1: railY - curlLift * 0.38,\n x2: rootX + reach * 0.6,\n y2: railY - curlLift * 0.58,\n x: rootX + reach * 0.73,\n y: railY - curlLift * 0.5,\n },\n ]);\n const rightDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"vine/detail\", leafPairs * 2 + index) - 0.5,\n curlLift * 0.06,\n );\n structural.push(leftCurl, displaceInteriorY(mirrorPath(leftCurl, width), rightDisplacement));\n }\n\n const decorative: GatePath[] = [];\n const leafHalfWidth = canonicalNumber(Math.min(halfSpan * 0.035, upperHeight * 0.12));\n const leafHalfHeight = canonicalNumber(Math.min(upperHeight * 0.075, 7));\n for (let index = 0; index < leafPairs; index += 1) {\n const detail = sampleScalar(seed, \"vine/detail\", index);\n const along = 0.18 + (0.64 * (index + leafNode)) / (leafPairs + 1);\n const leafX = canonicalNumber(edge + halfSpan * along);\n const leftLeafDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n 0.5 - detail,\n lift * 0.08,\n );\n const leafY = canonicalNumber(railY - lift * (0.28 + along * 0.56) + leftLeafDisplacement);\n const leftLeaf = canonicalizePath([\n { kind: \"M\", x: leafX, y: leafY + leafHalfHeight },\n {\n kind: \"Q\",\n x1: leafX - leafHalfWidth,\n y1: leafY,\n x: leafX,\n y: leafY - leafHalfHeight,\n },\n {\n kind: \"Q\",\n x1: leafX + leafHalfWidth,\n y1: leafY,\n x: leafX,\n y: leafY + leafHalfHeight,\n },\n { kind: \"Z\" },\n ]);\n const leftTwig = canonicalizePath([\n { kind: \"M\", x: leafX, y: railY },\n {\n kind: \"Q\",\n x1: leafX + (index % 2 === 0 ? -leafHalfWidth : leafHalfWidth),\n y1: (railY + leafY) / 2,\n x: leafX,\n y: leafY + leafHalfHeight,\n },\n ]);\n const rightLeafDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"vine/detail\", index + leafPairs) - 0.5,\n leafHalfHeight * 0.24,\n );\n structural.push(leftTwig, mirrorPath(leftTwig, width));\n decorative.push(\n leftLeaf,\n displaceInteriorY(mirrorPath(leftLeaf, width), rightLeafDisplacement),\n );\n }\n\n const sideMiddle = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 1.0001);\n const leftSide =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: bottomY },\n { kind: \"L\", x: edge + sideReach * 0.62, y: railY },\n ])\n : sideLevel === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: bottomY },\n {\n kind: \"Q\",\n x1: edge + sideReach,\n y1: sideMiddle,\n x: edge,\n y: railY,\n },\n { kind: \"L\", x: edge + sideReach * 0.72, y: sideMiddle },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: bottomY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: bottomY - (bottomY - sideMiddle) * 0.46,\n x2: edge,\n y2: sideMiddle + frameBand * 0.3,\n x: edge + sideReach * 0.58,\n y: sideMiddle,\n },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: sideMiddle - frameBand * 0.3,\n x2: edge,\n y2: railY + (sideMiddle - railY) * 0.46,\n x: edge,\n y: railY,\n },\n ]);\n decorative.push(leftSide, mirrorPath(leftSide, width));\n\n return { structural, decorative };\n};\n\nconst composeFan = (\n seed: GateSeed,\n options: NormalizedGateGenerationOptionsV2,\n layout: Readonly<{\n width: number;\n edge: number;\n railY: number;\n bottomY: number;\n frameBand: number;\n safeLeft: number;\n }>,\n): ComposedFamilyPaths => {\n const { width, edge, railY, bottomY, frameBand, safeLeft } = layout;\n const composition = sampleIndex(seed, \"fan/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"fan/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"fan/sides\")),\n );\n const raysPerHalf = [3, 5, 7][motifLevel] as number;\n\n const upperHeight = railY - edge;\n const halfSpan = width / 2 - edge;\n const originRatio = 0.58 + 0.24 * sampleScalar(seed, \"fan/anchor/origin-height\");\n const originY = canonicalNumber(railY + (bottomY - railY) * originRatio);\n const lift = canonicalNumber(\n upperHeight * (0.48 + options.peakHeight * 0.22 + options.curvature * 0.1),\n );\n const structural: GatePath[] = [];\n\n for (let index = 0; index < raysPerHalf; index += 1) {\n const fraction = (index + 1) / (raysPerHalf + 1);\n const detail = sampleScalar(seed, \"fan/detail\", index);\n const targetX = canonicalNumber(edge + halfSpan * fraction);\n const leftTargetDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n 0.5 - detail,\n lift * 0.06,\n );\n const targetY = canonicalNumber(\n railY - lift * (0.34 + fraction * 0.62) + leftTargetDisplacement,\n );\n const leftRay =\n composition === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: originY },\n { kind: \"L\", x: edge, y: railY },\n { kind: \"L\", x: targetX, y: targetY },\n ])\n : composition === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: originY },\n { kind: \"L\", x: edge, y: railY },\n {\n kind: \"L\",\n x: edge + halfSpan * fraction * 0.24,\n y: railY + frameBand * (0.72 - fraction * 0.24),\n },\n {\n kind: \"L\",\n x: edge + halfSpan * fraction * 0.58,\n y: railY - lift * fraction * 0.34,\n },\n { kind: \"L\", x: targetX, y: targetY },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: originY },\n { kind: \"L\", x: edge, y: railY },\n {\n kind: \"Q\",\n x1: edge + halfSpan * fraction * 0.38,\n y1: railY - lift * fraction * 0.18,\n x: targetX,\n y: targetY,\n },\n { kind: \"L\", x: width / 2, y: railY },\n ]);\n const mirroredRightRay = mirrorPath(leftRay, width);\n const rightTargetIndex =\n composition === 2 ? mirroredRightRay.length - 2 : mirroredRightRay.length - 1;\n const rightTargetDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"fan/detail\", index + raysPerHalf) - 0.5,\n lift * 0.05,\n );\n const rightRay = canonicalizePath(\n mirroredRightRay.map((command, commandIndex) =>\n commandIndex === rightTargetIndex && (command.kind === \"L\" || command.kind === \"Q\")\n ? { ...command, y: command.y + rightTargetDisplacement }\n : command,\n ),\n );\n structural.push(leftRay, rightRay);\n }\n\n const decorative: GatePath[] = [];\n const sideMiddle = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 1.0001);\n const leftSide =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge + sideReach * 0.32, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.32, y: bottomY },\n ])\n : sideLevel === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.42, y: sideMiddle - frameBand * 0.48 },\n { kind: \"L\", x: edge + sideReach, y: sideMiddle },\n { kind: \"L\", x: edge, y: bottomY },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.72, y: sideMiddle },\n { kind: \"L\", x: edge, y: bottomY },\n ]);\n decorative.push(leftSide, mirrorPath(leftSide, width));\n\n return { structural, decorative };\n};\n\nconst composeVolute = (\n seed: GateSeed,\n options: NormalizedGateGenerationOptionsV2,\n layout: Readonly<{\n width: number;\n edge: number;\n railY: number;\n bottomY: number;\n frameBand: number;\n safeLeft: number;\n }>,\n): ComposedFamilyPaths => {\n const { width, edge, railY, bottomY, frameBand, safeLeft } = layout;\n const composition = sampleIndex(seed, \"volute/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"volute/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"volute/sides\")),\n );\n const pairCount = [1, 2, 3][motifLevel] as number;\n\n const upperHeight = railY - edge;\n const halfSpan = width / 2 - edge;\n const upperRight = canonicalNumber(width - edge);\n const upperWidth = canonicalNumber(upperRight - edge);\n const coilRadius = canonicalNumber(\n upperWidth * (0.1 + 0.08 * sampleScalar(seed, \"volute/proportion/coil-radius\")),\n );\n const lift = canonicalNumber(\n upperHeight * (0.5 + options.curvature * 0.2 + options.peakHeight * 0.14),\n );\n const structural: GatePath[] = [];\n\n if (composition === 0) {\n for (let index = 0; index < pairCount; index += 1) {\n const nesting = 1 - index * 0.18;\n const startX = canonicalNumber(edge + index * Math.min(5, frameBand * 0.2));\n const centerX = canonicalNumber(\n edge + Math.min(halfSpan * 0.78, coilRadius * (1.3 + index * 0.2)),\n );\n const coilLift = canonicalNumber(lift * nesting);\n const leftVolute = canonicalizePath([\n { kind: \"M\", x: startX, y: railY },\n {\n kind: \"C\",\n x1: startX + coilRadius * 0.18,\n y1: railY - coilLift * 0.54,\n x2: centerX - coilRadius * 0.5,\n y2: railY - coilLift,\n x: centerX,\n y: railY - coilLift * 0.66,\n },\n {\n kind: \"C\",\n x1: centerX + coilRadius * 0.32,\n y1: railY - coilLift * 0.4,\n x2: centerX + coilRadius * 0.16,\n y2: railY - coilLift * 0.18,\n x: centerX - coilRadius * 0.08,\n y: railY - coilLift * 0.28,\n },\n {\n kind: \"C\",\n x1: centerX - coilRadius * 0.2,\n y1: railY - coilLift * 0.36,\n x2: centerX - coilRadius * 0.24,\n y2: railY - coilLift * 0.1,\n x: centerX - coilRadius * 0.42,\n y: railY,\n },\n ]);\n structural.push(leftVolute, mirrorPath(leftVolute, width));\n }\n } else if (composition === 1) {\n const crownPath = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + coilRadius * 0.4,\n y1: railY - lift * 0.66,\n x2: width / 2 - coilRadius * 1.15,\n y2: railY - lift,\n x: width / 2 - coilRadius * 0.42,\n y: railY - lift * 0.6,\n },\n {\n kind: \"C\",\n x1: width / 2 - coilRadius * 0.08,\n y1: railY - lift * 0.36,\n x2: width / 2 - coilRadius * 0.28,\n y2: railY - lift * 0.14,\n x: width / 2,\n y: railY - lift * 0.72,\n },\n {\n kind: \"C\",\n x1: width / 2 + coilRadius * 0.28,\n y1: railY - lift * 0.14,\n x2: width / 2 + coilRadius * 0.08,\n y2: railY - lift * 0.36,\n x: width / 2 + coilRadius * 0.42,\n y: railY - lift * 0.6,\n },\n {\n kind: \"C\",\n x1: width / 2 + coilRadius * 1.15,\n y1: railY - lift,\n x2: width - edge - coilRadius * 0.4,\n y2: railY - lift * 0.66,\n x: width - edge,\n y: railY,\n },\n ]);\n structural.push(...pairedCenteredPaths(crownPath, width));\n for (let index = 0; index < pairCount; index += 1) {\n const spread = canonicalNumber(coilRadius * (0.45 + index * 0.32));\n const bracePath = canonicalizePath([\n { kind: \"M\", x: width / 2 - spread, y: railY },\n {\n kind: \"Q\",\n x1: width / 2,\n y1: railY - lift * (0.28 + index * 0.08),\n x: width / 2 + spread,\n y: railY,\n },\n ]);\n structural.push(...pairedCenteredPaths(bracePath, width));\n }\n } else {\n for (let index = 0; index < pairCount; index += 1) {\n const nesting = 1 - index * 0.16;\n const startX = canonicalNumber(edge + index * Math.min(6, frameBand * 0.22));\n const reach = canonicalNumber(Math.min(halfSpan * 0.86, coilRadius * (1.25 + index * 0.28)));\n const cascadeLift = canonicalNumber(lift * nesting);\n const leftCascade = canonicalizePath([\n { kind: \"M\", x: startX, y: railY },\n {\n kind: \"C\",\n x1: startX + reach * 0.22,\n y1: railY - cascadeLift * 0.84,\n x2: startX + reach * 0.68,\n y2: railY - cascadeLift,\n x: startX + reach,\n y: railY - cascadeLift * 0.54,\n },\n {\n kind: \"C\",\n x1: startX + reach * 0.88,\n y1: railY - cascadeLift * 0.22,\n x2: startX + reach * 0.58,\n y2: railY - cascadeLift * 0.14,\n x: startX + reach * 0.42,\n y: railY,\n },\n ]);\n structural.push(leftCascade, mirrorPath(leftCascade, width));\n }\n const centerStem = canonicalizePath([\n { kind: \"M\", x: width / 2, y: railY },\n { kind: \"L\", x: width / 2, y: railY - lift * 0.64 },\n ]);\n structural.push(...pairedCenteredPaths(centerStem, width));\n }\n\n const decorative: GatePath[] = [];\n const sideMiddle = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 1.0001);\n const leftSide =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: railY + (sideMiddle - railY) * 0.42,\n x2: edge + sideReach,\n y2: sideMiddle - frameBand * 0.24,\n x: edge,\n y: sideMiddle,\n },\n ])\n : sideLevel === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: railY + (sideMiddle - railY) * 0.38,\n x2: edge,\n y2: sideMiddle - frameBand * 0.28,\n x: edge + sideReach * 0.62,\n y: sideMiddle,\n },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: sideMiddle + frameBand * 0.28,\n x2: edge,\n y2: bottomY - (bottomY - sideMiddle) * 0.38,\n x: edge,\n y: bottomY,\n },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: railY + (sideMiddle - railY) * 0.28,\n x2: edge + sideReach,\n y2: sideMiddle - frameBand * 0.4,\n x: edge + sideReach * 0.46,\n y: sideMiddle - frameBand * 0.18,\n },\n {\n kind: \"C\",\n x1: edge,\n y1: sideMiddle,\n x2: edge + sideReach,\n y2: sideMiddle + frameBand * 0.12,\n x: edge + sideReach * 0.68,\n y: sideMiddle + frameBand * 0.3,\n },\n {\n kind: \"C\",\n x1: edge + sideReach,\n y1: sideMiddle + frameBand * 0.5,\n x2: edge,\n y2: bottomY - (bottomY - sideMiddle) * 0.28,\n x: edge,\n y: bottomY,\n },\n ]);\n const rightSideDisplacement = quantizedSymmetryDisplacement(\n options.symmetry,\n sampleScalar(seed, \"volute/detail\", pairCount) - 0.5,\n frameBand * 0.12,\n );\n decorative.push(leftSide, displaceInteriorY(mirrorPath(leftSide, width), rightSideDisplacement));\n\n return { structural, decorative };\n};\n\nexport function generateGateV2(\n dimensionsInput: GateDimensions,\n optionsInput: GateGenerationOptionsV2,\n): Readonly<GateGeometryV2> {\n const dimensions = normalizeDimensions(dimensionsInput);\n const { seed, options } = normalizeFamilyOptions(optionsInput, 2);\n const { width, height } = dimensions;\n const edge = canonicalNumber(INSET + STROKE_WIDTH / 2);\n const railY = canonicalNumber(Math.max(edge + 32, height * 0.3));\n const bottomY = canonicalNumber(height - edge);\n const frameBand = canonicalNumber(Math.max(12, Math.min(24, Math.min(width, height) * 0.06)));\n const safeLeft = canonicalNumber(edge + frameBand);\n const safeRight = canonicalNumber(width - safeLeft);\n const safeTop = canonicalNumber(railY + frameBand);\n const safeBottom = canonicalNumber(bottomY - frameBand);\n const centerX = canonicalNumber(width / 2);\n\n const surfacePath = canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: width - edge, y: railY },\n { kind: \"L\", x: width - edge, y: bottomY },\n { kind: \"L\", x: edge, y: bottomY },\n { kind: \"Z\" },\n { kind: \"M\", x: safeLeft, y: safeTop },\n { kind: \"L\", x: safeLeft, y: safeBottom },\n { kind: \"L\", x: safeRight, y: safeBottom },\n { kind: \"L\", x: safeRight, y: safeTop },\n { kind: \"Z\" },\n ]);\n const framePath = canonicalizePath([\n { kind: \"M\", x: edge, y: bottomY },\n { kind: \"L\", x: edge, y: railY },\n { kind: \"L\", x: width - edge, y: railY },\n { kind: \"L\", x: width - edge, y: bottomY },\n { kind: \"Z\" },\n ]);\n\n if (\n options.family === \"courtyard\" ||\n options.family === \"fleuron\" ||\n options.family === \"vine\" ||\n options.family === \"fan\" ||\n options.family === \"volute\"\n ) {\n const familyLayout = {\n width,\n edge,\n railY,\n bottomY,\n frameBand,\n safeLeft,\n };\n const composed =\n options.family === \"courtyard\"\n ? composeCourtyard(seed, options, familyLayout)\n : options.family === \"fleuron\"\n ? composeFleuron(seed, options, familyLayout)\n : options.family === \"vine\"\n ? composeVine(seed, options, familyLayout)\n : options.family === \"fan\"\n ? composeFan(seed, options, familyLayout)\n : composeVolute(seed, options, familyLayout);\n const decorativePaths = [...composed.decorative];\n const crestPath = createCrestPath(options.crest, centerX, edge, railY, options.peakHeight);\n if (crestPath !== undefined) {\n decorativePaths.push(...pairedCenteredPaths(crestPath, width));\n }\n\n return deepFreeze({\n schemaVersion: 1,\n generationVersion: 2,\n seed,\n dimensions,\n viewBox: { minX: 0, minY: 0, width, height },\n options,\n bounds: {\n left: edge,\n right: canonicalNumber(width - edge),\n railY,\n bottomY,\n },\n contentInsets: {\n top: safeTop,\n right: canonicalNumber(width - safeRight),\n bottom: canonicalNumber(height - safeBottom),\n left: safeLeft,\n },\n surfacePath,\n structuralPaths: [framePath, ...composed.structural],\n decorativePaths,\n });\n }\n\n const composition = sampleIndex(seed, \"arcade/composition\", 3);\n const motifLevel = Math.min(\n 2,\n Math.floor(3 * options.density + sampleScalar(seed, \"arcade/motif-count\")),\n );\n const sideLevel = Math.min(\n 2,\n Math.floor(3 * options.sideComplexity + sampleScalar(seed, \"arcade/sides\")),\n );\n const bayCount = [2, 3, 5][motifLevel] as number;\n const span = width - edge * 2;\n const upperHeight = railY - edge;\n const springRatio = 0.32 + 0.26 * sampleScalar(seed, \"arcade/anchor/spring-height\");\n const archLift = canonicalNumber(\n upperHeight *\n springRatio *\n (0.72 + options.curvature * 0.28) *\n (0.78 + options.peakHeight * 0.22),\n );\n const boundaries = Array.from({ length: bayCount + 1 }, (_, index) =>\n canonicalNumber(edge + (span * index) / bayCount),\n );\n const arches: GatePath[] = [];\n for (let index = 0; index < bayCount; index += 1) {\n const left = boundaries[index] as number;\n const right = boundaries[index + 1] as number;\n const detail = sampleScalar(seed, \"arcade/detail\", index);\n const displacement = quantizedSymmetryDisplacement(\n options.symmetry,\n detail - 0.5,\n (right - left) * 0.16,\n );\n const roundBay = canonicalizePath([\n { kind: \"M\", x: left, y: railY },\n {\n kind: \"Q\",\n x1: (left + right) / 2 + displacement,\n y1: railY - archLift,\n x: right,\n y: railY,\n },\n ]);\n const center = (left + right) / 2;\n const pointedBay = canonicalizePath([\n { kind: \"M\", x: left, y: railY },\n {\n kind: \"C\",\n x1: left + (right - left) * 0.2 + displacement,\n y1: railY - archLift * 0.42,\n x2: center - (right - left) * 0.12 + displacement,\n y2: railY - archLift,\n x: center + displacement,\n y: railY - archLift,\n },\n {\n kind: \"C\",\n x1: center + (right - left) * 0.12 + displacement,\n y1: railY - archLift,\n x2: right - (right - left) * 0.2 + displacement,\n y2: railY - archLift * 0.42,\n x: right,\n y: railY,\n },\n ]);\n const mirroredPairIndex = Math.min(index, bayCount - 1 - index);\n arches.push(\n composition === 0 || (composition === 2 && mirroredPairIndex % 2 === 0)\n ? roundBay\n : pointedBay,\n );\n }\n\n const centerPair = centerPairForWidth(width);\n if (centerPair.left !== centerPair.right) {\n if (options.symmetry === 1) {\n for (let index = 0; index < Math.floor(bayCount / 2); index += 1) {\n const leftBay = arches[index] as GatePath;\n arches[bayCount - 1 - index] = mirrorPath(leftBay, width);\n }\n }\n if (bayCount % 2 === 1) {\n const middleIndex = Math.floor(bayCount / 2);\n const middleBay = arches[middleIndex] as GatePath;\n arches.splice(middleIndex + 1, 0, mirrorPath(middleBay, width));\n }\n }\n\n const decorativePaths: GatePath[] = [];\n const crestPath = createCrestPath(options.crest, centerX, edge, railY, options.peakHeight);\n if (crestPath !== undefined) {\n decorativePaths.push(...pairedCenteredPaths(crestPath, width));\n }\n\n const sideCenterY = canonicalNumber((railY + bottomY) / 2);\n const sideReach = canonicalNumber(safeLeft - edge - 2);\n const leftSide: GatePath =\n sideLevel === 0\n ? canonicalizePath([\n { kind: \"M\", x: edge + sideReach * 0.34, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.34, y: bottomY },\n ])\n : sideLevel === 1\n ? canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n {\n kind: \"Q\",\n x1: edge + sideReach * (0.65 + options.curvature * 0.25),\n y1: sideCenterY,\n x: edge,\n y: bottomY,\n },\n ])\n : canonicalizePath([\n { kind: \"M\", x: edge, y: railY },\n { kind: \"L\", x: edge + sideReach * 0.55, y: sideCenterY - frameBand * 0.5 },\n { kind: \"L\", x: edge + sideReach, y: sideCenterY },\n { kind: \"L\", x: edge + sideReach * 0.55, y: sideCenterY + frameBand * 0.5 },\n { kind: \"L\", x: edge, y: bottomY },\n ]);\n decorativePaths.push(leftSide, mirrorPath(leftSide, width));\n\n return deepFreeze({\n schemaVersion: 1,\n generationVersion: 2,\n seed,\n dimensions,\n viewBox: { minX: 0, minY: 0, width, height },\n options,\n bounds: {\n left: edge,\n right: canonicalNumber(width - edge),\n railY,\n bottomY,\n },\n contentInsets: {\n top: safeTop,\n right: canonicalNumber(width - safeRight),\n bottom: canonicalNumber(height - safeBottom),\n left: safeLeft,\n },\n surfacePath,\n structuralPaths: [framePath, ...arches],\n decorativePaths,\n });\n}\n","import { normalizeDimensions, normalizeFamilyOptions } from \"../family-options.js\";\n\nexport { compatibleCrestsForFamily, isCompatibleCrest, isGateFamily } from \"../family-options.js\";\n\nimport { canonicalizePath, canonicalNumber, deepFreeze, mirrorPath } from \"../geometry-utils.js\";\nimport type {\n GateDimensions,\n GateGenerationOptionsV3,\n GateGeometryV3,\n GatePath,\n GatePathCommand,\n} from \"../types.js\";\nimport { sampleScalar } from \"./sampler.js\";\n\nexport function generateGateV3(\n dimensions: GateDimensions,\n optionsInput: GateGenerationOptionsV3,\n): Readonly<GateGeometryV3> {\n const { seed, options } = normalizeFamilyOptions(optionsInput, 3);\n dimensions = normalizeDimensions(dimensions);\n const { width, height } = dimensions;\n const edge = 9;\n const railY = canonicalNumber(Math.max(edge + 32, height * 0.3));\n const bottomY = canonicalNumber(height - edge);\n const frameBand = canonicalNumber(Math.max(12, Math.min(24, Math.min(width, height) * 0.06)));\n const safeLeft = canonicalNumber(edge + frameBand);\n const safeRight = canonicalNumber(width - safeLeft);\n const safeTop = canonicalNumber(railY + frameBand);\n const safeBottom = canonicalNumber(bottomY - frameBand);\n const source = {\n seed,\n options,\n dimensions,\n bounds: { left: edge, right: canonicalNumber(width - edge), railY, bottomY },\n contentInsets: {\n left: safeLeft,\n right: canonicalNumber(width - safeRight),\n top: safeTop,\n bottom: canonicalNumber(height - safeBottom),\n },\n surfacePath: canonicalizePath([\n m(edge, railY),\n l(width - edge, railY),\n l(width - edge, bottomY),\n l(edge, bottomY),\n z,\n m(safeLeft, safeTop),\n l(safeLeft, safeBottom),\n l(safeRight, safeBottom),\n l(safeRight, safeTop),\n z,\n ]),\n structuralPaths: [\n canonicalizePath([\n m(edge, bottomY),\n l(edge, railY),\n l(width - edge, railY),\n l(width - edge, bottomY),\n z,\n ]),\n ],\n };\n const { railY: rail, bottomY: bottom } = source.bounds;\n const { family, crest, density, curvature, peakHeight, sideComplexity } = source.options;\n const upper = (rail - edge) * (0.94 + peakHeight * 0.06);\n const center = width / 2;\n const half = center - edge;\n const band = source.contentInsets.left - edge;\n const structure: GatePath[] = [source.structuralPaths[0] as GatePath];\n const ornaments: GatePath[] = [];\n const fine: GatePath[] = [];\n const solid: GatePath[] = [];\n const centered = (collection: GatePath[], paths: readonly GatePath[]): void => {\n for (const path of paths) {\n const canonical = canonicalizePath(path);\n collection.push(canonical);\n if (Math.round(width * 10_000) % 2 === 1) collection.push(mirrorPath(canonical, width));\n }\n };\n const rightHeightFactor =\n 1 -\n (1 - options.symmetry) * (0.06 + 0.04 * sampleScalar(seed, `${family}/proportion/right-lift`));\n const pair = (collection: GatePath[], path: GatePath): void => {\n const canonical = canonicalizePath(path);\n const right = mirrorPath(canonical, width);\n const isUpper = path.every((command) =>\n Object.entries(command).every(\n ([key, value]) => !key.startsWith(\"y\") || Number(value) <= rail,\n ),\n );\n collection.push(\n canonical,\n isUpper && options.symmetry < 1\n ? place(right, 0, rail * (1 - rightHeightFactor), 1, rightHeightFactor)\n : right,\n );\n };\n\n // A second bar and small collars give the border the rhythm of assembled ironwork.\n const barX = edge + Math.min(7, band * 0.36);\n pair(fine, [m(barX, rail), l(barX, bottom)]);\n fine.push(canonicalizePath([m(edge, bottom - 7), l(width - edge, bottom - 7)]));\n for (const fraction of sideComplexity > 0.65 ? [0.2, 0.5, 0.8] : [0.28, 0.72]) {\n const y = rail + (bottom - rail) * fraction;\n pair(solid, [\n m(edge, y - 1.5),\n l(barX + 2, y - 1.5),\n l(barX + 2, y + 1.5),\n l(edge, y + 1.5),\n z,\n ]);\n }\n\n const crestHeight = Math.min(upper * (0.7 + peakHeight * 0.12), width * 0.29);\n const crestTop = rail - crestHeight - 4;\n const reserve = crest === \"fleur\" ? crestHeight * 0.44 + 7 : crest === \"none\" ? 9 : 16;\n if (crest === \"fleur\") {\n const fleurHeight = crestHeight * 0.84;\n const [crown, collar, foot] = fleurDeLys(center, rail - fleurHeight - 4, fleurHeight);\n centered(fine, [crown, foot]);\n centered(solid, [collar]);\n centered(structure, [[m(center, rail), l(center, rail - 4)]]);\n } else if (crest !== \"none\") {\n const capHeight = Math.min(22, crestHeight * 0.35);\n const capWidth = capHeight * (crest === \"diamond\" ? 0.32 : 0.22);\n centered(solid, [\n placeEmblem(\n [\n m(0, 0),\n l(capWidth, capHeight * 0.58),\n l(0, capHeight),\n l(-capWidth, capHeight * 0.58),\n z,\n ],\n center,\n crestTop,\n 1,\n ),\n ]);\n centered(structure, [[m(center, crestTop + capHeight), l(center, rail)]]);\n centered(fine, [\n canonicalizePath([\n m(center - 4, crestTop + capHeight + 4),\n l(center + 4, crestTop + capHeight + 4),\n ]),\n ]);\n }\n\n const usable = half - reserve - 9;\n const variation = sampleScalar(source.seed, `${family}/proportion/study-lift`);\n const count = Math.max(\n 1,\n Math.min(\n family === \"arcade\" ? 2 + Math.round(density * 2) : 1 + Math.round(density * 2),\n Math.floor(usable / 46),\n ),\n );\n const cell = usable / count;\n\n if (family === \"fan\") {\n // Every ray terminates on the same cubic canopy, at its evaluated point.\n const span = half - reserve;\n const lift = Math.min(upper * (0.6 + variation * 0.12) * (0.86 + curvature * 0.14), span * 0.9);\n const a = { x: edge, y: rail };\n const b = { x: edge + span * 0.2, y: rail - lift * 0.7 };\n const d = { x: edge + span, y: rail - lift };\n const p = { x: edge + span * 0.65, y: rail - lift };\n pair(structure, [m(a.x, a.y), c(b.x, b.y, p.x, p.y, d.x, d.y), l(d.x, rail)]);\n const rays = Math.min(3 + Math.round(density * 3), Math.max(2, Math.floor(span / 16)));\n for (let index = 1; index < rays; index++) {\n const tip = cubicPoint(a, b, p, d, index / rays);\n pair(ornaments, [m(edge + span, rail), l(tip.x, tip.y)]);\n }\n } else if (family === \"arcade\") {\n // Piers meet rounded arch spring points; neighbouring bays have their own breathing room.\n for (let index = 0; index < count; index++) {\n const x = edge + 7 + cell * index;\n const w = cell - 9;\n const h = Math.min(\n upper * (0.6 + variation * 0.1 + (0.1 * index) / count) * (0.86 + curvature * 0.14),\n w * 1.15,\n );\n const shoulder = rail - h * 0.5;\n pair(ornaments, [\n m(x, rail),\n l(x, shoulder),\n c(x, rail - h * 0.82, x + w * 0.22, rail - h, x + w * 0.5, rail - h),\n c(x + w * 0.78, rail - h, x + w, rail - h * 0.82, x + w, shoulder),\n l(x + w, rail),\n ]);\n }\n } else if (family !== \"vine\") {\n const span = half - reserve;\n const coilWidth = Math.min(span * 0.57, upper * (family === \"volute\" ? 1.12 : 0.9));\n const coilX = edge + span - coilWidth;\n const height = Math.min(\n upper *\n (family === \"courtyard\" ? 0.61 : family === \"fleuron\" ? 0.79 : 0.88) *\n (0.94 + curvature * 0.06 + variation * 0.035),\n coilWidth * 1.25,\n );\n const top = rail - height;\n const curl = scroll(coilX, top, coilWidth, height);\n pair(ornaments, [\n m(edge, rail),\n c(edge, rail - height * 0.72, coilX + coilWidth * 0.18, top, coilX + coilWidth * 0.53, top),\n ...curl.slice(2, coilWidth < 34 ? 5 : undefined),\n ]);\n // A second, lower curl fits below the rising crown instead of crossing it.\n if (span > 120 && density > 0.25) {\n const smallWidth = Math.min(upper * 0.49, span * 0.25);\n const smallHeight = height * (family === \"volute\" ? 0.36 : 0.29);\n pair(\n fine,\n scroll(edge + span * 0.24, rail - smallHeight, smallWidth, smallHeight).slice(0, 5),\n );\n }\n } else {\n for (let index = 0; index < count; index++) {\n const w = Math.min(cell - 10, upper * 0.94);\n const x = edge + 7 + cell * index + (cell - 10 - w) / 2;\n const hierarchy = count === 1 ? 0.78 : 0.54 + (0.24 * index) / (count - 1);\n const h = Math.min(\n upper * hierarchy * (0.88 + curvature * 0.12 + variation * 0.08),\n w * 1.25,\n );\n const top = rail - h;\n // Small slots omit the tight terminal turn rather than compressing it into a knot.\n const curl = scroll(x, top, w, h);\n pair(ornaments, w < 34 ? curl.slice(0, 5) : curl);\n if (family === \"vine\") {\n // Leaves grow from the rising bar, on its outside; there are no free-standing buds.\n for (const t of w > 50 ? [0.24, 0.45] : [0.34]) {\n const node = cubicPoint(\n { x, y: rail },\n { x, y: top + h * 0.48 },\n { x: x + w * 0.18, y: top },\n { x: x + w * 0.53, y: top },\n t,\n );\n const size = Math.min(11, w * 0.16);\n pair(solid, [\n m(node.x, node.y),\n c(\n node.x - size * 0.6,\n node.y - size * 0.05,\n node.x - size,\n node.y - size * 0.75,\n node.x - size * 0.7,\n node.y - size * 1.5,\n ),\n c(\n node.x - size * 0.05,\n node.y - size,\n node.x + size * 0.12,\n node.y - size * 0.5,\n node.x,\n node.y,\n ),\n z,\n ]);\n }\n }\n }\n }\n\n return deepFreeze({\n schemaVersion: 1,\n generationVersion: 3,\n seed,\n options,\n dimensions,\n viewBox: { minX: 0, minY: 0, width, height },\n bounds: source.bounds,\n contentInsets: source.contentInsets,\n surfacePath: source.surfacePath,\n structuralPaths: structure,\n finePaths: fine,\n decorativePaths: ornaments,\n solidPaths: solid,\n });\n}\n\ntype Point = Readonly<{ x: number; y: number }>;\nconst cubicPoint = (a: Point, b: Point, c: Point, d: Point, t: number): Point => {\n const u = 1 - t;\n return {\n x: u ** 3 * a.x + 3 * u ** 2 * t * b.x + 3 * u * t ** 2 * c.x + t ** 3 * d.x,\n y: u ** 3 * a.y + 3 * u ** 2 * t * b.y + 3 * u * t ** 2 * c.y + t ** 3 * d.y,\n };\n};\n\nconst m = (x: number, y: number): GatePathCommand => ({ kind: \"M\", x, y });\nconst l = (x: number, y: number): GatePathCommand => ({ kind: \"L\", x, y });\nconst c = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x: number,\n y: number,\n): GatePathCommand => ({ kind: \"C\", x1, y1, x2, y2, x, y });\nconst z: GatePathCommand = { kind: \"Z\" };\n\nconst place = (path: GatePath, x: number, y: number, sx: number, sy = sx): GatePath =>\n canonicalizePath(\n path.map((command) => {\n if (command.kind === \"Z\") return command;\n const point = { x: x + command.x * sx, y: y + command.y * sy };\n if (command.kind === \"C\")\n return {\n kind: \"C\",\n ...point,\n x1: x + command.x1 * sx,\n y1: y + command.y1 * sy,\n x2: x + command.x2 * sx,\n y2: y + command.y2 * sy,\n };\n if (command.kind === \"Q\")\n return { kind: \"Q\", ...point, x1: x + command.x1 * sx, y1: y + command.y1 * sy };\n return { kind: command.kind, ...point };\n }),\n );\n\n/** Heraldic silhouette selected in ART-01. */\nconst placeEmblem = (path: GatePath, center: number, top: number, scale: number): GatePath => {\n const centerUnits = Math.round(center * 10_000);\n return canonicalizePath(\n path.map(\n (command) =>\n Object.fromEntries(\n Object.entries(command).map(([key, value]) => [\n key,\n key.startsWith(\"x\")\n ? (centerUnits +\n Math.sign(Number(value)) * Math.round(Math.abs(Number(value)) * scale * 10_000)) /\n 10_000\n : key.startsWith(\"y\")\n ? top + Number(value) * scale\n : value,\n ]),\n ) as unknown as GatePathCommand,\n ),\n );\n};\n\nexport function fleurDeLys(x: number, top: number, height: number): [GatePath, GatePath, GatePath] {\n const crown = [\n m(-0.12, 0.682),\n c(-0.14, 0.55, -0.25, 0.39, -0.3, 0.44),\n c(-0.35, 0.49, -0.3, 0.55, -0.25, 0.5),\n c(-0.28, 0.68, -0.47, 0.55, -0.36, 0.36),\n c(-0.29, 0.25, -0.15, 0.32, -0.055, 0.51),\n c(-0.13, 0.3, -0.14, 0.16, 0, 0),\n c(0.14, 0.16, 0.13, 0.3, 0.055, 0.51),\n c(0.15, 0.32, 0.29, 0.25, 0.36, 0.36),\n c(0.47, 0.55, 0.28, 0.68, 0.25, 0.5),\n c(0.3, 0.55, 0.35, 0.49, 0.3, 0.44),\n c(0.25, 0.39, 0.14, 0.55, 0.12, 0.682),\n l(-0.12, 0.682),\n z,\n ];\n const collar = [m(-0.13, 0.682), l(0.13, 0.682), l(0.13, 0.708), l(-0.13, 0.708), z];\n const foot = [\n m(-0.075, 0.708),\n c(-0.08, 0.81, -0.14, 0.85, -0.2, 0.86),\n c(-0.14, 0.93, -0.07, 0.91, -0.035, 0.86),\n c(-0.04, 0.93, -0.03, 0.97, 0, 1),\n c(0.03, 0.97, 0.04, 0.93, 0.035, 0.86),\n c(0.07, 0.91, 0.14, 0.93, 0.2, 0.86),\n c(0.14, 0.85, 0.08, 0.81, 0.075, 0.708),\n l(-0.075, 0.708),\n z,\n ];\n return [\n placeEmblem(crown, x, top, height),\n placeEmblem(collar, x, top, height),\n placeEmblem(foot, x, top, height),\n ];\n}\n\nexport function scroll(x: number, top: number, width: number, height: number): GatePath {\n return place(\n [\n m(0, 1),\n c(0, 0.48, 0.18, 0, 0.53, 0),\n c(0.82, 0, 1, 0.18, 1, 0.44),\n c(1, 0.68, 0.83, 0.83, 0.65, 0.83),\n c(0.49, 0.83, 0.39, 0.72, 0.39, 0.6),\n c(0.39, 0.49, 0.47, 0.42, 0.56, 0.42),\n c(0.64, 0.42, 0.69, 0.48, 0.69, 0.54),\n ],\n x,\n top,\n width,\n height,\n );\n}\n","import { generateGate as generateCourtyardV1 } from \"./courtyard.js\";\nimport type {\n GateDimensions,\n GateGenerationOptions,\n GateGenerationOptionsV1,\n GateGenerationOptionsV2,\n GateGenerationOptionsV3,\n GateGeometry,\n GateGeometryV1,\n GateGeometryV2,\n GateGeometryV3,\n} from \"./types.js\";\nimport { generateGateV2 } from \"./v2/generate.js\";\nimport { generateGateV3 } from \"./v3/generate.js\";\n\nconst V2_ONLY_OPTION_KEYS = [\"symmetry\", \"peakHeight\", \"sideComplexity\", \"crest\"] as const;\n\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptionsV3,\n): Readonly<GateGeometryV3>;\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptionsV1,\n): Readonly<GateGeometryV1>;\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptionsV2,\n): Readonly<GateGeometryV2>;\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptionsV2 | GateGenerationOptionsV3,\n): Readonly<GateGeometryV2 | GateGeometryV3>;\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptions,\n): Readonly<GateGeometry>;\nexport function generateGate(\n dimensions: GateDimensions,\n options: GateGenerationOptions,\n): Readonly<GateGeometry> {\n if (\n options !== null &&\n typeof options === \"object\" &&\n Object.hasOwn(options, \"generationVersion\") &&\n options.generationVersion === 3\n ) {\n return generateGateV3(dimensions, options);\n }\n if (\n options !== null &&\n typeof options === \"object\" &&\n Object.hasOwn(options, \"generationVersion\") &&\n (options as { readonly generationVersion?: unknown }).generationVersion === 2\n ) {\n return generateGateV2(dimensions, options as GateGenerationOptionsV2);\n }\n\n if (options !== null && typeof options === \"object\") {\n for (const key of V2_ONLY_OPTION_KEYS) {\n if (Object.hasOwn(options, key)) {\n throw new TypeError(`${key} requires generationVersion 2`);\n }\n }\n }\n\n return generateCourtyardV1(\n dimensions,\n options as GateGenerationOptionsV1,\n ) as Readonly<GateGeometryV1>;\n}\n","import { generateGate } from \"./dispatch.js\";\nimport type {\n GateCrest,\n GateDimensions,\n GateFamily,\n GateGenerationOptionsV1,\n GateGenerationOptionsV2,\n GateGenerationOptionsV3,\n GateGeometry,\n GatePaintOptions,\n GatePath,\n GatePathCommand,\n} from \"./types.js\";\n\nconst HEX_COLOR = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst COLOR_KEYWORD = /^(?:transparent|currentcolor)$/i;\nconst FUNCTION_COLOR = /^(rgb|rgba|hsl|hsla)\\((.*)\\)$/i;\nconst DECIMAL_NUMBER = /^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)$/;\nconst XML_DELIMITER = /[&<>\"']/;\n\ntype RuntimeRecord = Record<string, unknown>;\n\nconst sourceDimensions = (dimensions: GateDimensions): GateDimensions => {\n const { width, height } = dimensions;\n for (const sourceWidth of [width, width - 0.000_049_9, width + 0.000_049_9]) {\n for (const sourceHeight of [height, height - 0.000_049_9, height + 0.000_049_9]) {\n const ratio = sourceWidth / sourceHeight;\n if (ratio >= 0.5 && ratio <= 6) return { width: sourceWidth, height: sourceHeight };\n }\n }\n return dimensions;\n};\n\nconst requirePlainObject = (value: unknown, name: string): RuntimeRecord => {\n if (value === null || typeof value !== \"object\") {\n throw new TypeError(`${name} must be a plain object`);\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new TypeError(`${name} must be a plain object`);\n }\n\n return value as RuntimeRecord;\n};\n\nconst structurallyEqual = (left: unknown, right: unknown): boolean => {\n if (left === right) {\n return true;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n return (\n Array.isArray(left) &&\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((value, index) => structurallyEqual(value, right[index]))\n );\n }\n if (left === null || right === null || typeof left !== \"object\" || typeof right !== \"object\") {\n return false;\n }\n\n const leftRecord = left as RuntimeRecord;\n const rightRecord = right as RuntimeRecord;\n const leftKeys = Reflect.ownKeys(leftRecord);\n const rightKeys = Reflect.ownKeys(rightRecord);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.hasOwn(rightRecord, key) &&\n structurallyEqual(Reflect.get(leftRecord, key), Reflect.get(rightRecord, key)),\n )\n );\n};\n\nconst regenerateGeometry = (\n geometry: RuntimeRecord,\n sourceDimensions: GateDimensions,\n): Readonly<GateGeometry> => {\n const options = geometry.options as RuntimeRecord;\n if (geometry.generationVersion === 1) {\n const publicOptions: GateGenerationOptionsV1 = {\n generationVersion: 1,\n seed: geometry.seed as string | number,\n family: \"courtyard\",\n density: options.density as number,\n curvature: options.curvature as number,\n };\n return generateGate(sourceDimensions, publicOptions);\n }\n\n const publicOptions: GateGenerationOptionsV2 | GateGenerationOptionsV3 = {\n generationVersion: geometry.generationVersion === 3 ? 3 : 2,\n seed: geometry.seed as string | number,\n family: options.family as GateFamily,\n density: options.density as number,\n curvature: options.curvature as number,\n symmetry: options.symmetry as number,\n peakHeight: options.peakHeight as number,\n sideComplexity: options.sideComplexity as number,\n crest: options.crest as GateCrest,\n };\n return generateGate(sourceDimensions, publicOptions);\n};\n\nconst validateGeometryForSerialization = (value: unknown): Readonly<GateGeometry> => {\n const geometry = requirePlainObject(value, \"geometry\");\n const dimensions = requirePlainObject(geometry.dimensions, \"geometry.dimensions\");\n const canonicalGeometry = regenerateGeometry(\n geometry,\n sourceDimensions(dimensions as unknown as GateDimensions),\n );\n if (!structurallyEqual(geometry, canonicalGeometry)) {\n throw new TypeError(\"geometry must exactly match canonical generated geometry\");\n }\n return canonicalGeometry;\n};\n\nconst hasXmlBreakingCharacter = (value: string): boolean => {\n if (XML_DELIMITER.test(value)) {\n return true;\n }\n\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= 8 || codeUnit === 11 || codeUnit === 12 || (codeUnit >= 14 && codeUnit <= 31)) {\n return true;\n }\n if (codeUnit === 127) {\n return true;\n }\n }\n\n return false;\n};\n\nconst parseChannel = (token: string, maximum: number, percentOnly = false): boolean => {\n const percent = token.endsWith(\"%\");\n const numberText = percent ? token.slice(0, -1) : token;\n\n if ((percentOnly && !percent) || !DECIMAL_NUMBER.test(numberText)) {\n return false;\n }\n\n const value = Number(numberText);\n const upperBound = percent ? 100 : maximum;\n return Number.isFinite(value) && value >= 0 && value <= upperBound;\n};\n\nconst isFunctionalColor = (paint: string): boolean => {\n const match = FUNCTION_COLOR.exec(paint);\n if (match === null) {\n return false;\n }\n\n const functionName = match[1]?.toLowerCase();\n const channels = match[2]?.split(\",\").map((channel) => channel.trim()) ?? [];\n const hasAlpha = functionName === \"rgba\" || functionName === \"hsla\";\n\n if (channels.length !== (hasAlpha ? 4 : 3) || channels.some((channel) => channel === \"\")) {\n return false;\n }\n\n if (functionName === \"rgb\" || functionName === \"rgba\") {\n const colorChannels = channels.slice(0, 3);\n if (!colorChannels.every((channel) => parseChannel(channel, 255))) {\n return false;\n }\n } else {\n const [hue, saturation, lightness] = channels;\n if (\n hue === undefined ||\n saturation === undefined ||\n lightness === undefined ||\n !DECIMAL_NUMBER.test(hue) ||\n !Number.isFinite(Number(hue)) ||\n !parseChannel(saturation, 100, true) ||\n !parseChannel(lightness, 100, true)\n ) {\n return false;\n }\n }\n\n const alpha = channels[3];\n return alpha === undefined || parseChannel(alpha, 1);\n};\n\nconst normalizePaint = (value: string, name: \"stroke\" | \"surface\"): string => {\n if (typeof value !== \"string\") {\n throw new TypeError(`${name} paint must be a string`);\n }\n\n const paint = value.trim();\n if (\n paint.length === 0 ||\n hasXmlBreakingCharacter(paint) ||\n (!HEX_COLOR.test(paint) && !COLOR_KEYWORD.test(paint) && !isFunctionalColor(paint))\n ) {\n throw new TypeError(`${name} paint must be a safe literal CSS color`);\n }\n\n return paint;\n};\n\nconst escapeXmlAttribute = (value: string): string =>\n value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"'\", \"'\");\n\nconst serializeCommand = (command: GatePathCommand): string => {\n switch (command.kind) {\n case \"M\":\n case \"L\":\n return `${command.kind}${command.x} ${command.y}`;\n case \"C\":\n return `C${command.x1} ${command.y1} ${command.x2} ${command.y2} ${command.x} ${command.y}`;\n case \"Q\":\n return `Q${command.x1} ${command.y1} ${command.x} ${command.y}`;\n case \"Z\":\n return \"Z\";\n }\n};\n\nconst serializePath = (path: GatePath): string => path.map(serializeCommand).join(\" \");\n\nexport function renderGateSVG(geometry: GateGeometry, paint: GatePaintOptions = {}): string {\n const canonicalGeometry = validateGeometryForSerialization(geometry);\n const stroke = escapeXmlAttribute(normalizePaint(paint.stroke ?? \"currentColor\", \"stroke\"));\n const surface = escapeXmlAttribute(normalizePaint(paint.surface ?? \"transparent\", \"surface\"));\n const { width, height } = canonicalGeometry.dimensions;\n const viewBox = canonicalGeometry.viewBox;\n const surfacePath = `<path d=\"${serializePath(canonicalGeometry.surfacePath)}\" fill=\"${surface}\" fill-rule=\"evenodd\" stroke=\"none\"/>`;\n if (canonicalGeometry.generationVersion === 3) {\n const paths = (items: readonly GatePath[]): string =>\n items.map((path) => `<path d=\"${serializePath(path)}\"/>`).join(\"\");\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox.minX} ${viewBox.minY} ${viewBox.width} ${viewBox.height}\" data-gate-frame-generation-version=\"3\">${surfacePath}<g stroke=\"${stroke}\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><g stroke-width=\"2\">${paths(canonicalGeometry.structuralPaths)}</g><g stroke-width=\"1.8\">${paths(canonicalGeometry.decorativePaths)}</g><g stroke-width=\"1.2\">${paths(canonicalGeometry.finePaths)}</g><g stroke-width=\"0.8\" fill=\"${stroke}\">${paths(canonicalGeometry.solidPaths)}</g></g></svg>`;\n }\n const ironPaths = [\n ...canonicalGeometry.structuralPaths.map(\n (path) => `<path d=\"${serializePath(path)}\" fill=\"none\"/>`,\n ),\n ...canonicalGeometry.decorativePaths.map(\n (path) => `<path d=\"${serializePath(path)}\" fill=\"none\"/>`,\n ),\n ].join(\"\");\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox.minX} ${viewBox.minY} ${viewBox.width} ${viewBox.height}\" data-gate-frame-generation-version=\"${canonicalGeometry.generationVersion}\">${surfacePath}<g stroke=\"${stroke}\" stroke-width=\"${canonicalGeometry.options.strokeWidth}\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${ironPaths}</g></svg>`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
//#region src/core/types.d.ts
|
|
2
|
+
type GateSeed = string | number;
|
|
3
|
+
type GateGenerationVersion = 1 | 2 | 3;
|
|
4
|
+
type GateFamily = "courtyard" | "fleuron" | "arcade" | "vine" | "fan" | "volute";
|
|
5
|
+
type GateCrest = "spear" | "fleur" | "diamond" | "none";
|
|
6
|
+
interface GateDimensions {
|
|
7
|
+
readonly width: number;
|
|
8
|
+
readonly height: number;
|
|
9
|
+
}
|
|
10
|
+
interface GateGenerationOptionsV1 {
|
|
11
|
+
readonly seed: GateSeed;
|
|
12
|
+
readonly generationVersion?: 1;
|
|
13
|
+
readonly family: "courtyard";
|
|
14
|
+
readonly density?: number;
|
|
15
|
+
readonly curvature?: number;
|
|
16
|
+
readonly symmetry?: never;
|
|
17
|
+
readonly peakHeight?: never;
|
|
18
|
+
readonly sideComplexity?: never;
|
|
19
|
+
readonly crest?: never;
|
|
20
|
+
}
|
|
21
|
+
interface GateGenerationOptionsV2 {
|
|
22
|
+
readonly seed: GateSeed;
|
|
23
|
+
readonly generationVersion: 2;
|
|
24
|
+
readonly family?: GateFamily | "auto";
|
|
25
|
+
readonly density?: number;
|
|
26
|
+
readonly curvature?: number;
|
|
27
|
+
readonly symmetry?: number;
|
|
28
|
+
readonly peakHeight?: number;
|
|
29
|
+
readonly sideComplexity?: number;
|
|
30
|
+
readonly crest?: GateCrest;
|
|
31
|
+
}
|
|
32
|
+
interface GateGenerationOptionsV3 extends Omit<GateGenerationOptionsV2, "generationVersion"> {
|
|
33
|
+
readonly generationVersion: 3;
|
|
34
|
+
}
|
|
35
|
+
type GateGenerationOptions = GateGenerationOptionsV1 | GateGenerationOptionsV2 | GateGenerationOptionsV3;
|
|
36
|
+
interface NormalizedGateGenerationOptionsV1 {
|
|
37
|
+
readonly generationVersion: 1;
|
|
38
|
+
readonly family: "courtyard";
|
|
39
|
+
readonly density: number;
|
|
40
|
+
readonly curvature: number;
|
|
41
|
+
readonly symmetry: 1;
|
|
42
|
+
readonly crest: "spear";
|
|
43
|
+
readonly inset: 8;
|
|
44
|
+
readonly strokeWidth: 2;
|
|
45
|
+
}
|
|
46
|
+
interface NormalizedGateGenerationOptionsV2 {
|
|
47
|
+
readonly generationVersion: 2;
|
|
48
|
+
readonly family: GateFamily;
|
|
49
|
+
readonly density: number;
|
|
50
|
+
readonly curvature: number;
|
|
51
|
+
readonly symmetry: number;
|
|
52
|
+
readonly peakHeight: number;
|
|
53
|
+
readonly sideComplexity: number;
|
|
54
|
+
readonly crest: GateCrest;
|
|
55
|
+
readonly inset: 8;
|
|
56
|
+
readonly strokeWidth: 2;
|
|
57
|
+
}
|
|
58
|
+
interface NormalizedGateGenerationOptionsV3 extends Omit<NormalizedGateGenerationOptionsV2, "generationVersion"> {
|
|
59
|
+
readonly generationVersion: 3;
|
|
60
|
+
}
|
|
61
|
+
type NormalizedGateGenerationOptions = NormalizedGateGenerationOptionsV1 | NormalizedGateGenerationOptionsV2 | NormalizedGateGenerationOptionsV3;
|
|
62
|
+
interface GatePaintOptions {
|
|
63
|
+
readonly stroke?: string;
|
|
64
|
+
readonly surface?: string;
|
|
65
|
+
}
|
|
66
|
+
type GatePathCommand = Readonly<{
|
|
67
|
+
kind: "M" | "L";
|
|
68
|
+
x: number;
|
|
69
|
+
y: number;
|
|
70
|
+
}> | Readonly<{
|
|
71
|
+
kind: "C";
|
|
72
|
+
x1: number;
|
|
73
|
+
y1: number;
|
|
74
|
+
x2: number;
|
|
75
|
+
y2: number;
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
}> | Readonly<{
|
|
79
|
+
kind: "Q";
|
|
80
|
+
x1: number;
|
|
81
|
+
y1: number;
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
}> | Readonly<{
|
|
85
|
+
kind: "Z";
|
|
86
|
+
}>;
|
|
87
|
+
type GatePath = ReadonlyArray<GatePathCommand>;
|
|
88
|
+
interface GateInsets {
|
|
89
|
+
readonly top: number;
|
|
90
|
+
readonly right: number;
|
|
91
|
+
readonly bottom: number;
|
|
92
|
+
readonly left: number;
|
|
93
|
+
}
|
|
94
|
+
interface GateGeometryBase {
|
|
95
|
+
readonly schemaVersion: 1;
|
|
96
|
+
readonly seed: GateSeed;
|
|
97
|
+
readonly dimensions: Readonly<GateDimensions>;
|
|
98
|
+
readonly viewBox: Readonly<{
|
|
99
|
+
readonly minX: number;
|
|
100
|
+
readonly minY: number;
|
|
101
|
+
readonly width: number;
|
|
102
|
+
readonly height: number;
|
|
103
|
+
}>;
|
|
104
|
+
readonly bounds: Readonly<{
|
|
105
|
+
readonly left: number;
|
|
106
|
+
readonly right: number;
|
|
107
|
+
readonly railY: number;
|
|
108
|
+
readonly bottomY: number;
|
|
109
|
+
}>;
|
|
110
|
+
readonly contentInsets: Readonly<GateInsets>;
|
|
111
|
+
readonly surfacePath: GatePath;
|
|
112
|
+
readonly structuralPaths: ReadonlyArray<GatePath>;
|
|
113
|
+
readonly decorativePaths: ReadonlyArray<GatePath>;
|
|
114
|
+
}
|
|
115
|
+
interface GateGeometryV1 extends GateGeometryBase {
|
|
116
|
+
readonly generationVersion: 1;
|
|
117
|
+
readonly options: Readonly<NormalizedGateGenerationOptionsV1>;
|
|
118
|
+
}
|
|
119
|
+
interface GateGeometryV2 extends GateGeometryBase {
|
|
120
|
+
readonly generationVersion: 2;
|
|
121
|
+
readonly options: Readonly<NormalizedGateGenerationOptionsV2>;
|
|
122
|
+
}
|
|
123
|
+
interface GateGeometryV3 extends GateGeometryBase {
|
|
124
|
+
readonly generationVersion: 3;
|
|
125
|
+
readonly options: Readonly<NormalizedGateGenerationOptionsV3>;
|
|
126
|
+
readonly finePaths: ReadonlyArray<GatePath>;
|
|
127
|
+
readonly solidPaths: ReadonlyArray<GatePath>;
|
|
128
|
+
}
|
|
129
|
+
type GateGeometry = GateGeometryV1 | GateGeometryV2 | GateGeometryV3;
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/core/dispatch.d.ts
|
|
132
|
+
declare function generateGate(dimensions: GateDimensions, options: GateGenerationOptionsV3): Readonly<GateGeometryV3>;
|
|
133
|
+
declare function generateGate(dimensions: GateDimensions, options: GateGenerationOptionsV1): Readonly<GateGeometryV1>;
|
|
134
|
+
declare function generateGate(dimensions: GateDimensions, options: GateGenerationOptionsV2): Readonly<GateGeometryV2>;
|
|
135
|
+
declare function generateGate(dimensions: GateDimensions, options: GateGenerationOptionsV2 | GateGenerationOptionsV3): Readonly<GateGeometryV2 | GateGeometryV3>;
|
|
136
|
+
declare function generateGate(dimensions: GateDimensions, options: GateGenerationOptions): Readonly<GateGeometry>;
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/core/svg.d.ts
|
|
139
|
+
declare function renderGateSVG(geometry: GateGeometry, paint?: GatePaintOptions): string;
|
|
140
|
+
//#endregion
|
|
141
|
+
export { NormalizedGateGenerationOptionsV2 as C, NormalizedGateGenerationOptionsV1 as S, GatePaintOptions as _, GateFamily as a, GateSeed as b, GateGenerationOptionsV2 as c, GateGeometry as d, GateGeometryBase as f, GateInsets as g, GateGeometryV3 as h, GateDimensions as i, GateGenerationOptionsV3 as l, GateGeometryV2 as m, generateGate as n, GateGenerationOptions as o, GateGeometryV1 as p, GateCrest as r, GateGenerationOptionsV1 as s, renderGateSVG as t, GateGenerationVersion as u, GatePath as v, NormalizedGateGenerationOptionsV3 as w, NormalizedGateGenerationOptions as x, GatePathCommand as y };
|
|
142
|
+
//# sourceMappingURL=index-B0WElJq8.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B0WElJq8.d.ts","names":[],"sources":["../src/core/types.ts","../src/core/dispatch.ts","../src/core/svg.ts"],"mappings":";KAAY;KAEA;KAEA;KAEA;UAEK;WACN;WACA;;UAGM;WACN,MAAM;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;UAGM;WACN,MAAM;WACN;WACA,SAAS;WACT;WACA;WACA;WACA;WACA;WACA,QAAQ;;UAGF,gCACP,KAAK;WACJ;;KAGC,wBACR,0BACA,0BACA;UAEa;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;UAGM;WACN;WACA,QAAQ;WACR;WACA;WACA;WACA;WACA;WACA,OAAO;WACP;WACA;;UAGM,0CACP,KAAK;WACJ;;KAGC,kCACR,oCACA,oCACA;UAEa;WACN;WACA;;KAGC,kBACR;EAAW;EAAiB;EAAW;KACvC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;KAEF;EAAW;EAAW;EAAY;EAAY;EAAW;KACzD;EAAW;;KAEH,WAAW,cAAc;UAEpB;WACN;WACA;WACA;WACA;;UAGM;WACN;WACA,MAAM;WACN,YAAY,SAAS;WACrB,SAAS;aACP;aACA;aACA;aACA;;WAEF,QAAQ;aACN;aACA;aACA;aACA;;WAEF,eAAe,SAAS;WACxB,aAAa;WACb,iBAAiB,cAAc;WAC/B,iBAAiB,cAAc;;UAGzB,uBAAuB;WAC7B;WACA,SAAS,SAAS;;UAGZ,uBAAuB;WAC7B;WACA,SAAS,SAAS;;UAGZ,uBAAuB;WAC7B;WACA,SAAS,SAAS;WAClB,WAAW,cAAc;WACzB,YAAY,cAAc;;KAGzB,eAAe,iBAAiB,iBAAiB;;;iBCnI7C,aACd,YAAY,gBACZ,SAAS,0BACR,SAAS;iBACI,aACd,YAAY,gBACZ,SAAS,0BACR,SAAS;iBACI,aACd,YAAY,gBACZ,SAAS,0BACR,SAAS;iBACI,aACd,YAAY,gBACZ,SAAS,0BAA0B,0BAClC,SAAS,iBAAiB;iBACb,aACd,YAAY,gBACZ,SAAS,wBACR,SAAS;;;iBCiMI,cAAc,UAAU,cAAc,QAAO"}
|