human2ai 0.1.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 +120 -0
- package/assets/quaternius/License_Standard.txt +22 -0
- package/assets/quaternius/README.md +31 -0
- package/assets/quaternius/Superhero_Female_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Female_FullBody.gltf +2056 -0
- package/assets/quaternius/Superhero_Male_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Male_FullBody.gltf +2018 -0
- package/dist/cli/integration.d.ts +39 -0
- package/dist/cli/integration.js +466 -0
- package/dist/cli/integration.js.map +1 -0
- package/dist/cli/main.d.ts +17 -0
- package/dist/cli/main.js +1455 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/database/composition-session-repository.d.ts +37 -0
- package/dist/database/composition-session-repository.js +147 -0
- package/dist/database/composition-session-repository.js.map +1 -0
- package/dist/database/draft-version-errors.d.ts +29 -0
- package/dist/database/draft-version-errors.js +47 -0
- package/dist/database/draft-version-errors.js.map +1 -0
- package/dist/database/draft-version-store.d.ts +30 -0
- package/dist/database/draft-version-store.js +168 -0
- package/dist/database/draft-version-store.js.map +1 -0
- package/dist/database/image-asset-repository.d.ts +37 -0
- package/dist/database/image-asset-repository.js +101 -0
- package/dist/database/image-asset-repository.js.map +1 -0
- package/dist/database/image-input.d.ts +15 -0
- package/dist/database/image-input.js +28 -0
- package/dist/database/image-input.js.map +1 -0
- package/dist/database/migrate.d.ts +4 -0
- package/dist/database/migrate.js +45 -0
- package/dist/database/migrate.js.map +1 -0
- package/dist/database/project-session-repository.d.ts +72 -0
- package/dist/database/project-session-repository.js +291 -0
- package/dist/database/project-session-repository.js.map +1 -0
- package/dist/database/spatial-session-repository.d.ts +26 -0
- package/dist/database/spatial-session-repository.js +44 -0
- package/dist/database/spatial-session-repository.js.map +1 -0
- package/dist/database/style-library-repository.d.ts +70 -0
- package/dist/database/style-library-repository.js +290 -0
- package/dist/database/style-library-repository.js.map +1 -0
- package/dist/database/svg-input.d.ts +1 -0
- package/dist/database/svg-input.js +77 -0
- package/dist/database/svg-input.js.map +1 -0
- package/dist/database/ui-sketch-session-repository.d.ts +19 -0
- package/dist/database/ui-sketch-session-repository.js +35 -0
- package/dist/database/ui-sketch-session-repository.js.map +1 -0
- package/dist/domain/canvas-layer-order.d.ts +6 -0
- package/dist/domain/canvas-layer-order.js +40 -0
- package/dist/domain/canvas-layer-order.js.map +1 -0
- package/dist/domain/canvas-node-metadata.d.ts +20 -0
- package/dist/domain/canvas-node-metadata.js +17 -0
- package/dist/domain/canvas-node-metadata.js.map +1 -0
- package/dist/domain/canvas-states.d.ts +8 -0
- package/dist/domain/canvas-states.js +23 -0
- package/dist/domain/canvas-states.js.map +1 -0
- package/dist/domain/composition/analysis.d.ts +104 -0
- package/dist/domain/composition/analysis.js +337 -0
- package/dist/domain/composition/analysis.js.map +1 -0
- package/dist/domain/composition/camera-reference.d.ts +24 -0
- package/dist/domain/composition/camera-reference.js +34 -0
- package/dist/domain/composition/camera-reference.js.map +1 -0
- package/dist/domain/composition/draft.d.ts +50 -0
- package/dist/domain/composition/draft.js +609 -0
- package/dist/domain/composition/draft.js.map +1 -0
- package/dist/domain/composition/frame.d.ts +23 -0
- package/dist/domain/composition/frame.js +154 -0
- package/dist/domain/composition/frame.js.map +1 -0
- package/dist/domain/composition/geometry.d.ts +15 -0
- package/dist/domain/composition/geometry.js +262 -0
- package/dist/domain/composition/geometry.js.map +1 -0
- package/dist/domain/composition/index.d.ts +13 -0
- package/dist/domain/composition/index.js +10 -0
- package/dist/domain/composition/index.js.map +1 -0
- package/dist/domain/composition/layers.d.ts +4 -0
- package/dist/domain/composition/layers.js +12 -0
- package/dist/domain/composition/layers.js.map +1 -0
- package/dist/domain/composition/records.d.ts +14 -0
- package/dist/domain/composition/records.js +2 -0
- package/dist/domain/composition/records.js.map +1 -0
- package/dist/domain/composition/refinement/engine.d.ts +12 -0
- package/dist/domain/composition/refinement/engine.js +521 -0
- package/dist/domain/composition/refinement/engine.js.map +1 -0
- package/dist/domain/composition/refinement/relations.d.ts +16 -0
- package/dist/domain/composition/refinement/relations.js +293 -0
- package/dist/domain/composition/refinement/relations.js.map +1 -0
- package/dist/domain/composition/refinement/types.d.ts +181 -0
- package/dist/domain/composition/refinement/types.js +2 -0
- package/dist/domain/composition/refinement/types.js.map +1 -0
- package/dist/domain/composition/render.d.ts +5 -0
- package/dist/domain/composition/render.js +169 -0
- package/dist/domain/composition/render.js.map +1 -0
- package/dist/domain/composition/states.d.ts +9 -0
- package/dist/domain/composition/states.js +104 -0
- package/dist/domain/composition/states.js.map +1 -0
- package/dist/domain/composition/types.d.ts +149 -0
- package/dist/domain/composition/types.js +2 -0
- package/dist/domain/composition/types.js.map +1 -0
- package/dist/domain/composition/workflow.d.ts +15 -0
- package/dist/domain/composition/workflow.js +77 -0
- package/dist/domain/composition/workflow.js.map +1 -0
- package/dist/domain/fingerprint.d.ts +2 -0
- package/dist/domain/fingerprint.js +25 -0
- package/dist/domain/fingerprint.js.map +1 -0
- package/dist/domain/session/canvas-edit-history.d.ts +17 -0
- package/dist/domain/session/canvas-edit-history.js +53 -0
- package/dist/domain/session/canvas-edit-history.js.map +1 -0
- package/dist/domain/session/capabilities.d.ts +16 -0
- package/dist/domain/session/capabilities.js +84 -0
- package/dist/domain/session/capabilities.js.map +1 -0
- package/dist/domain/session/draft-version.d.ts +41 -0
- package/dist/domain/session/draft-version.js +2 -0
- package/dist/domain/session/draft-version.js.map +1 -0
- package/dist/domain/session/index.d.ts +5 -0
- package/dist/domain/session/index.js +3 -0
- package/dist/domain/session/index.js.map +1 -0
- package/dist/domain/session/types.d.ts +23 -0
- package/dist/domain/session/types.js +2 -0
- package/dist/domain/session/types.js.map +1 -0
- package/dist/domain/spatial/assets/quaternius-female-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-superhero-female.json +1 -0
- package/dist/domain/spatial/assets/quaternius-superhero.json +1 -0
- package/dist/domain/spatial/camera-box.d.ts +13 -0
- package/dist/domain/spatial/camera-box.js +52 -0
- package/dist/domain/spatial/camera-box.js.map +1 -0
- package/dist/domain/spatial/geometric-model.d.ts +4 -0
- package/dist/domain/spatial/geometric-model.js +101 -0
- package/dist/domain/spatial/geometric-model.js.map +1 -0
- package/dist/domain/spatial/hands.d.ts +36 -0
- package/dist/domain/spatial/hands.js +128 -0
- package/dist/domain/spatial/hands.js.map +1 -0
- package/dist/domain/spatial/index.d.ts +30 -0
- package/dist/domain/spatial/index.js +381 -0
- package/dist/domain/spatial/index.js.map +1 -0
- package/dist/domain/spatial/kinematics.d.ts +27 -0
- package/dist/domain/spatial/kinematics.js +285 -0
- package/dist/domain/spatial/kinematics.js.map +1 -0
- package/dist/domain/spatial/lighting.d.ts +35 -0
- package/dist/domain/spatial/lighting.js +173 -0
- package/dist/domain/spatial/lighting.js.map +1 -0
- package/dist/domain/spatial/model.d.ts +5 -0
- package/dist/domain/spatial/model.js +193 -0
- package/dist/domain/spatial/model.js.map +1 -0
- package/dist/domain/spatial/morph.d.ts +3 -0
- package/dist/domain/spatial/morph.js +187 -0
- package/dist/domain/spatial/morph.js.map +1 -0
- package/dist/domain/spatial/proportions.d.ts +46 -0
- package/dist/domain/spatial/proportions.js +59 -0
- package/dist/domain/spatial/proportions.js.map +1 -0
- package/dist/domain/spatial/reference-lines.d.ts +6 -0
- package/dist/domain/spatial/reference-lines.js +58 -0
- package/dist/domain/spatial/reference-lines.js.map +1 -0
- package/dist/domain/spatial/scene-cache.d.ts +15 -0
- package/dist/domain/spatial/scene-cache.js +69 -0
- package/dist/domain/spatial/scene-cache.js.map +1 -0
- package/dist/domain/spatial/scene.d.ts +8 -0
- package/dist/domain/spatial/scene.js +69 -0
- package/dist/domain/spatial/scene.js.map +1 -0
- package/dist/domain/spatial/types.d.ts +187 -0
- package/dist/domain/spatial/types.js +5 -0
- package/dist/domain/spatial/types.js.map +1 -0
- package/dist/domain/style/index.d.ts +1 -0
- package/dist/domain/style/index.js +2 -0
- package/dist/domain/style/index.js.map +1 -0
- package/dist/domain/style/prompt-summary.d.ts +2 -0
- package/dist/domain/style/prompt-summary.js +11 -0
- package/dist/domain/style/prompt-summary.js.map +1 -0
- package/dist/domain/style/types.d.ts +32 -0
- package/dist/domain/style/types.js +3 -0
- package/dist/domain/style/types.js.map +1 -0
- package/dist/domain/ui-sketch/draft.d.ts +12 -0
- package/dist/domain/ui-sketch/draft.js +424 -0
- package/dist/domain/ui-sketch/draft.js.map +1 -0
- package/dist/domain/ui-sketch/geometry.d.ts +7 -0
- package/dist/domain/ui-sketch/geometry.js +11 -0
- package/dist/domain/ui-sketch/geometry.js.map +1 -0
- package/dist/domain/ui-sketch/groups.d.ts +5 -0
- package/dist/domain/ui-sketch/groups.js +40 -0
- package/dist/domain/ui-sketch/groups.js.map +1 -0
- package/dist/domain/ui-sketch/index.d.ts +8 -0
- package/dist/domain/ui-sketch/index.js +8 -0
- package/dist/domain/ui-sketch/index.js.map +1 -0
- package/dist/domain/ui-sketch/layers.d.ts +4 -0
- package/dist/domain/ui-sketch/layers.js +11 -0
- package/dist/domain/ui-sketch/layers.js.map +1 -0
- package/dist/domain/ui-sketch/render.d.ts +2 -0
- package/dist/domain/ui-sketch/render.js +58 -0
- package/dist/domain/ui-sketch/render.js.map +1 -0
- package/dist/domain/ui-sketch/standardize.d.ts +17 -0
- package/dist/domain/ui-sketch/standardize.js +139 -0
- package/dist/domain/ui-sketch/standardize.js.map +1 -0
- package/dist/domain/ui-sketch/states.d.ts +5 -0
- package/dist/domain/ui-sketch/states.js +21 -0
- package/dist/domain/ui-sketch/states.js.map +1 -0
- package/dist/domain/ui-sketch/types.d.ts +73 -0
- package/dist/domain/ui-sketch/types.js +2 -0
- package/dist/domain/ui-sketch/types.js.map +1 -0
- package/dist/server/app.d.ts +18 -0
- package/dist/server/app.js +108 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/image-content-type-parser.d.ts +2 -0
- package/dist/server/image-content-type-parser.js +5 -0
- package/dist/server/image-content-type-parser.js.map +1 -0
- package/dist/server/routes/composition-sessions.d.ts +3 -0
- package/dist/server/routes/composition-sessions.js +190 -0
- package/dist/server/routes/composition-sessions.js.map +1 -0
- package/dist/server/routes/draft-version-routes.d.ts +10 -0
- package/dist/server/routes/draft-version-routes.js +201 -0
- package/dist/server/routes/draft-version-routes.js.map +1 -0
- package/dist/server/routes/image-assets.d.ts +3 -0
- package/dist/server/routes/image-assets.js +114 -0
- package/dist/server/routes/image-assets.js.map +1 -0
- package/dist/server/routes/project-sessions.d.ts +48 -0
- package/dist/server/routes/project-sessions.js +305 -0
- package/dist/server/routes/project-sessions.js.map +1 -0
- package/dist/server/routes/spatial-sessions.d.ts +3 -0
- package/dist/server/routes/spatial-sessions.js +80 -0
- package/dist/server/routes/spatial-sessions.js.map +1 -0
- package/dist/server/routes/style-library.d.ts +3 -0
- package/dist/server/routes/style-library.js +308 -0
- package/dist/server/routes/style-library.js.map +1 -0
- package/dist/server/routes/ui-sketch-sessions.d.ts +3 -0
- package/dist/server/routes/ui-sketch-sessions.js +14 -0
- package/dist/server/routes/ui-sketch-sessions.js.map +1 -0
- package/dist/server/runtime.d.ts +30 -0
- package/dist/server/runtime.js +123 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/spatial-render.d.ts +5 -0
- package/dist/server/spatial-render.js +360 -0
- package/dist/server/spatial-render.js.map +1 -0
- package/dist/server/start.d.ts +1 -0
- package/dist/server/start.js +3 -0
- package/dist/server/start.js.map +1 -0
- package/licenses/THIRD-PARTY-NOTICES.txt +16664 -0
- package/licenses/YisiUI-LICENSE +21 -0
- package/locales/en/common.json +671 -0
- package/migrations/0001_projects_and_sessions.sql +45 -0
- package/migrations/0002_composition_versions_and_refinements.sql +26 -0
- package/migrations/0003_ui_sketch_draft_versions.sql +12 -0
- package/migrations/0004_image_assets.sql +16 -0
- package/migrations/0005_style_library.sql +31 -0
- package/migrations/0006_session_styles.sql +6 -0
- package/migrations/0007_svg_image_assets.sql +19 -0
- package/migrations/0008_spatial_spaces.sql +20 -0
- package/package.json +82 -0
- package/schemas/composition-draft.schema.json +234 -0
- package/schemas/composition-refinement-plan.schema.json +758 -0
- package/schemas/spatial-draft.schema.json +517 -0
- package/schemas/spatial-operations.schema.json +1082 -0
- package/schemas/ui-layout-standardization-plan.schema.json +29 -0
- package/schemas/ui-sketch-draft.schema.json +197 -0
- package/skills/human2ai/SKILL.md +149 -0
- package/skills/human2ai/agents/openai.yaml +3 -0
- package/skills/human2ai/references/composition-projection.md +170 -0
- package/skills/human2ai/references/composition.md +79 -0
- package/skills/human2ai/references/spatial.md +188 -0
- package/skills/human2ai/references/svg-images.md +27 -0
- package/skills/human2ai/references/ui-layout.md +100 -0
- package/web/out/404/index.html +1 -0
- package/web/out/404.html +1 -0
- package/web/out/__next.__PAGE__.txt +26 -0
- package/web/out/__next._full.txt +21 -0
- package/web/out/__next._tree.txt +4 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_buildManifest.js +1 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_ssgManifest.js +1 -0
- package/web/out/_next/static/chunks/130-9fadd0432daff55d.js +1 -0
- package/web/out/_next/static/chunks/158-eb00456e1bab68b3.js +52 -0
- package/web/out/_next/static/chunks/20-0801fc297cda2a7a.js +1 -0
- package/web/out/_next/static/chunks/248-d4a79649dae2a3f8.js +259 -0
- package/web/out/_next/static/chunks/678-1305cadf8254d814.js +1 -0
- package/web/out/_next/static/chunks/728-eb8b667f79229443.js +1 -0
- package/web/out/_next/static/chunks/83607670-bc1279370476e59f.js +1 -0
- package/web/out/_next/static/chunks/app/_global-error/page-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/app/_not-found/page-c0cd75ac39fbf9cf.js +1 -0
- package/web/out/_next/static/chunks/app/composition/page-051ee2fabb12110a.js +1 -0
- package/web/out/_next/static/chunks/app/layout-745ca27ef8830f4f.js +1 -0
- package/web/out/_next/static/chunks/app/page-0027378a269a6168.js +1 -0
- package/web/out/_next/static/chunks/app/spatial/page-266dedc81784d4f6.js +1 -0
- package/web/out/_next/static/chunks/app/styles/page-d5cb83af828ea9ed.js +1 -0
- package/web/out/_next/static/chunks/app/ui-sketch/page-2a8436e05a05c618.js +1 -0
- package/web/out/_next/static/chunks/c3f2cda1-9e279dab137b7272.js +342 -0
- package/web/out/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js +1 -0
- package/web/out/_next/static/chunks/framework-6eacf80ec1e4c887.js +1 -0
- package/web/out/_next/static/chunks/main-5ee8fd93319f955c.js +5 -0
- package/web/out/_next/static/chunks/main-app-0cf10803ab17c700.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/app-error-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/forbidden-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-728204b7cccc4ed2.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/not-found-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/unauthorized-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/web/out/_next/static/chunks/webpack-97ae63c0e0b2a512.js +1 -0
- package/web/out/_next/static/css/3b7982b41ed8eccd.css +4 -0
- package/web/out/_next/static/css/81ae71f1d3e9a866.css +1 -0
- package/web/out/_next/static/css/8c3843f4951fa9f6.css +5 -0
- package/web/out/_next/static/css/c739d0131cdcc891.css +1 -0
- package/web/out/_next/static/css/ce1b4bb3ad3c6073.css +1 -0
- package/web/out/_next/static/css/db96ae2e88545d96.css +1 -0
- package/web/out/_not-found/__next._full.txt +18 -0
- package/web/out/_not-found/__next._not-found.__PAGE__.txt +24 -0
- package/web/out/_not-found/__next._tree.txt +3 -0
- package/web/out/_not-found/index.html +1 -0
- package/web/out/_not-found/index.txt +18 -0
- package/web/out/composition/__next._full.txt +25 -0
- package/web/out/composition/__next._tree.txt +6 -0
- package/web/out/composition/__next.composition.__PAGE__.txt +31 -0
- package/web/out/composition/index.html +1 -0
- package/web/out/composition/index.txt +25 -0
- package/web/out/index.html +1 -0
- package/web/out/index.txt +21 -0
- package/web/out/spatial/__next._full.txt +23 -0
- package/web/out/spatial/__next._tree.txt +4 -0
- package/web/out/spatial/__next.spatial.__PAGE__.txt +29 -0
- package/web/out/spatial/index.html +1 -0
- package/web/out/spatial/index.txt +23 -0
- package/web/out/styles/__next._full.txt +23 -0
- package/web/out/styles/__next._tree.txt +4 -0
- package/web/out/styles/__next.styles.__PAGE__.txt +29 -0
- package/web/out/styles/index.html +1 -0
- package/web/out/styles/index.txt +23 -0
- package/web/out/ui-sketch/__next._full.txt +25 -0
- package/web/out/ui-sketch/__next._tree.txt +6 -0
- package/web/out/ui-sketch/__next.ui-sketch.__PAGE__.txt +31 -0
- package/web/out/ui-sketch/index.html +1 -0
- package/web/out/ui-sketch/index.txt +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/domain/composition/records.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CompositionDraft } from "../types.ts";
|
|
2
|
+
import type { AnchorPointMap, CompositionRefinementAudit, CompositionRefinementPlan, CompositionRefinementResult, RefinementMethodDescription } from "./types.ts";
|
|
3
|
+
export declare const FOCUS_ANCHORS: AnchorPointMap;
|
|
4
|
+
export declare class RefinementConstraintError extends Error {
|
|
5
|
+
readonly audit: CompositionRefinementAudit;
|
|
6
|
+
constructor(audit: CompositionRefinementAudit);
|
|
7
|
+
}
|
|
8
|
+
export declare function refinementMethods(): RefinementMethodDescription[];
|
|
9
|
+
export declare function refinementPlanSchema(): object;
|
|
10
|
+
export declare function validateRefinementPlan(input: unknown): CompositionRefinementPlan;
|
|
11
|
+
export declare function applyRefinementPlan(input: CompositionDraft, planInput: unknown): CompositionRefinementResult;
|
|
12
|
+
export declare function auditRefinement(sourceInput: CompositionDraft, refinedInput: CompositionDraft, plan?: CompositionRefinementPlan): CompositionRefinementAudit;
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
2
|
+
import compositionRefinementPlanSchema from "../../../../schemas/composition-refinement-plan.schema.json" with {
|
|
3
|
+
type: "json"
|
|
4
|
+
};
|
|
5
|
+
import { areaClippedSides, draftFingerprint } from "../analysis.js";
|
|
6
|
+
import { moveItem, rotateArea, validateDraft, visibleAreaMetrics, } from "../draft.js";
|
|
7
|
+
import { areaGeometry, geometryBounds } from "../geometry.js";
|
|
8
|
+
import { COMPOSITION_CANVAS, canvasPointToFrame, framePointToCanvas, } from "../frame.js";
|
|
9
|
+
import { applyRelation, carryLinkedFocuses, checkRefinementRelation, refinementItem, validateRefinementLinks, } from "./relations.js";
|
|
10
|
+
const EPSILON = 1e-9;
|
|
11
|
+
export const FOCUS_ANCHORS = Object.freeze({
|
|
12
|
+
"optical-center": { x: 0.5, y: 0.55 },
|
|
13
|
+
"geometric-center": { x: 0.5, y: 0.5 },
|
|
14
|
+
"golden-right-upper": { x: 0.61803398875, y: 0.38196601125 },
|
|
15
|
+
"golden-left-upper": { x: 0.38196601125, y: 0.38196601125 },
|
|
16
|
+
"golden-right-lower": { x: 0.61803398875, y: 0.61803398875 },
|
|
17
|
+
"golden-left-lower": { x: 0.38196601125, y: 0.61803398875 },
|
|
18
|
+
"third-right-upper": { x: 2 / 3, y: 1 / 3 },
|
|
19
|
+
"third-left-upper": { x: 1 / 3, y: 1 / 3 },
|
|
20
|
+
"third-right-lower": { x: 2 / 3, y: 2 / 3 },
|
|
21
|
+
"third-left-lower": { x: 1 / 3, y: 2 / 3 },
|
|
22
|
+
});
|
|
23
|
+
const REFINEMENT_METHODS = [
|
|
24
|
+
{
|
|
25
|
+
id: "focus-anchor",
|
|
26
|
+
version: 1,
|
|
27
|
+
decisionOwner: "agent",
|
|
28
|
+
processingSemantics: ["scene-composition", "editorial-layout"],
|
|
29
|
+
description: "Move one Agent-selected focus to a named center, golden-section, or thirds anchor.",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "axis-relation",
|
|
33
|
+
version: 1,
|
|
34
|
+
decisionOwner: "agent",
|
|
35
|
+
processingSemantics: ["scene-composition", "editorial-layout"],
|
|
36
|
+
description: "Strengthen an Agent-selected parallel, perpendicular, or mirrored relation between two focus and area axes.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "rotation-alignment",
|
|
40
|
+
version: 1,
|
|
41
|
+
decisionOwner: "agent",
|
|
42
|
+
processingSemantics: ["scene-composition", "editorial-layout"],
|
|
43
|
+
description: "Align Agent-selected non-circular areas to a named horizontal, vertical, or diagonal axis.",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "block-alignment",
|
|
47
|
+
version: 1,
|
|
48
|
+
decisionOwner: "agent",
|
|
49
|
+
processingSemantics: ["editorial-layout"],
|
|
50
|
+
description: "Align Agent-selected area edges or centers to an Agent-selected anchor area.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "spacing-rhythm",
|
|
54
|
+
version: 1,
|
|
55
|
+
decisionOwner: "agent",
|
|
56
|
+
processingSemantics: ["editorial-layout"],
|
|
57
|
+
description: "Equalize horizontal or vertical edge spacing across Agent-selected areas.",
|
|
58
|
+
},
|
|
59
|
+
...[
|
|
60
|
+
{ id: "frame-placement", description: "Place a subject center, edge, or focus on an Agent-selected frame division." },
|
|
61
|
+
{ id: "size-ratio", description: "Set an explicit physical length or area ratio between selected measurements." },
|
|
62
|
+
{ id: "mirror-symmetry", description: "Mirror a target area across a named frame axis, matching position or geometry." },
|
|
63
|
+
{ id: "focus-flow", description: "Aim an existing direction line or a subject's local axis at a selected focus." },
|
|
64
|
+
].map((method) => ({ ...method, id: method.id, version: 1,
|
|
65
|
+
decisionOwner: "agent", processingSemantics: ["scene-composition", "editorial-layout"] })),
|
|
66
|
+
];
|
|
67
|
+
const METHOD_EXECUTORS = {
|
|
68
|
+
"focus-anchor": applyFocusAnchor,
|
|
69
|
+
"axis-relation": applyAxisRelation,
|
|
70
|
+
"rotation-alignment": applyRotationAlignment,
|
|
71
|
+
"block-alignment": applyBlockAlignment,
|
|
72
|
+
"spacing-rhythm": applySpacingRhythm,
|
|
73
|
+
"frame-placement": applyNamedRelation,
|
|
74
|
+
"size-ratio": applyNamedRelation,
|
|
75
|
+
"mirror-symmetry": applyNamedRelation,
|
|
76
|
+
"focus-flow": applyNamedRelation,
|
|
77
|
+
};
|
|
78
|
+
const ajv = new Ajv2020({ allErrors: true });
|
|
79
|
+
const validatePlanSchema = ajv.compile(compositionRefinementPlanSchema);
|
|
80
|
+
export class RefinementConstraintError extends Error {
|
|
81
|
+
audit;
|
|
82
|
+
constructor(audit) {
|
|
83
|
+
super(`Refinement violates protection constraints: ${audit.failedChecks.join(", ")}.`);
|
|
84
|
+
this.audit = audit;
|
|
85
|
+
this.name = "RefinementConstraintError";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function refinementMethods() {
|
|
89
|
+
return structuredClone(REFINEMENT_METHODS);
|
|
90
|
+
}
|
|
91
|
+
export function refinementPlanSchema() {
|
|
92
|
+
return structuredClone(compositionRefinementPlanSchema);
|
|
93
|
+
}
|
|
94
|
+
export function validateRefinementPlan(input) {
|
|
95
|
+
if (!validatePlanSchema(input)) {
|
|
96
|
+
throw new Error(formatValidationErrors(validatePlanSchema.errors));
|
|
97
|
+
}
|
|
98
|
+
return structuredClone(input);
|
|
99
|
+
}
|
|
100
|
+
export function applyRefinementPlan(input, planInput) {
|
|
101
|
+
const source = validateDraft(input);
|
|
102
|
+
const processingSemantic = source.processingSemantic;
|
|
103
|
+
if (processingSemantic === null) {
|
|
104
|
+
throw new Error("Composition mode is not selected. Ask the user to choose scene-composition or editorial-layout before refining.");
|
|
105
|
+
}
|
|
106
|
+
const plan = validateRefinementPlan(planInput);
|
|
107
|
+
const sourceFingerprint = draftFingerprint(source);
|
|
108
|
+
if (plan.sourceFingerprint !== sourceFingerprint) {
|
|
109
|
+
throw new Error(`Refinement plan is stale: expected ${sourceFingerprint}, received ${plan.sourceFingerprint}.`);
|
|
110
|
+
}
|
|
111
|
+
if (plan.version === 2)
|
|
112
|
+
validateRefinementLinks(source, plan);
|
|
113
|
+
let refinedDraft = source;
|
|
114
|
+
const appliedOperations = [];
|
|
115
|
+
for (const operation of plan.operations) {
|
|
116
|
+
const method = REFINEMENT_METHODS.find(({ id }) => id === operation.method);
|
|
117
|
+
if (!method.processingSemantics.includes(processingSemantic)) {
|
|
118
|
+
throw new Error(`${operation.method} does not support ${processingSemantic}.`);
|
|
119
|
+
}
|
|
120
|
+
const result = METHOD_EXECUTORS[operation.method](refinedDraft, operation);
|
|
121
|
+
const before = refinedDraft;
|
|
122
|
+
refinedDraft = plan.version === 2 ? carryLinkedFocuses(before, result.draft, plan) : result.draft;
|
|
123
|
+
appliedOperations.push(result.applied);
|
|
124
|
+
}
|
|
125
|
+
refinedDraft = validateDraft(refinedDraft);
|
|
126
|
+
const audit = auditRefinement(source, refinedDraft, plan);
|
|
127
|
+
if (plan.version === 2) {
|
|
128
|
+
audit.relations = plan.operations.map((operation, index) => checkRefinementRelation(source, refinedDraft, operation, index, (draft, op) => METHOD_EXECUTORS[op.method](draft, op).draft));
|
|
129
|
+
audit.failedChecks.push(...audit.relations.filter((check) => !check.passed)
|
|
130
|
+
.map((check) => `relations.${check.operationIndex}.${check.method}`));
|
|
131
|
+
audit.failedChecks.push(...plan.fixedIds.filter((id) => !equal(refinementItem(source, id), refinementItem(refinedDraft, id))).map((id) => `fixed.${id}`));
|
|
132
|
+
audit.passed = audit.failedChecks.length === 0;
|
|
133
|
+
}
|
|
134
|
+
if (!audit.passed)
|
|
135
|
+
throw new RefinementConstraintError(audit);
|
|
136
|
+
return {
|
|
137
|
+
version: 1,
|
|
138
|
+
kind: "composition-refinement-result",
|
|
139
|
+
sourceFingerprint,
|
|
140
|
+
plan,
|
|
141
|
+
refinedDraft,
|
|
142
|
+
appliedOperations,
|
|
143
|
+
audit,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function auditRefinement(sourceInput, refinedInput, plan) {
|
|
147
|
+
const source = validateDraft(sourceInput);
|
|
148
|
+
const refined = validateDraft(refinedInput);
|
|
149
|
+
const sourceMetrics = visibleAreaMetrics(source);
|
|
150
|
+
const refinedMetrics = visibleAreaMetrics(refined);
|
|
151
|
+
const focusShifts = source.focusPoints.map((focus, index) => frameDistance(focus, refined.focusPoints[index] ?? focus, source));
|
|
152
|
+
const areaShifts = source.areas.map((area, index) => frameDistance(area, refined.areas[index] ?? area, source));
|
|
153
|
+
const rotationShifts = source.areas.map((area, index) => Math.abs(angleDifference(refined.areas[index]?.rotation ?? 0, area.rotation ?? 0)));
|
|
154
|
+
const visibleAreaDeltas = sourceMetrics.visibleAreaShares.map((value, index) => Math.abs(value - (refinedMetrics.visibleAreaShares[index] ?? value)));
|
|
155
|
+
const changes = {
|
|
156
|
+
maximumFocusShift: maximum(focusShifts),
|
|
157
|
+
maximumAreaShift: maximum(areaShifts),
|
|
158
|
+
maximumRotationShift: maximum(rotationShifts),
|
|
159
|
+
maximumVisibleAreaShareDelta: maximum(visibleAreaDeltas),
|
|
160
|
+
occupiedAreaDelta: Math.abs(sourceMetrics.occupiedArea - refinedMetrics.occupiedArea),
|
|
161
|
+
clippedAreaDelta: Math.abs(sourceMetrics.clippedArea - refinedMetrics.clippedArea),
|
|
162
|
+
overlapAreaDelta: Math.abs(sourceMetrics.overlapArea - refinedMetrics.overlapArea),
|
|
163
|
+
visualCenterShift: distance(sourceMetrics.visualCenter, refinedMetrics.visualCenter),
|
|
164
|
+
};
|
|
165
|
+
const sourceAreaIds = source.areas.map(({ id }) => id);
|
|
166
|
+
const refinedAreaIds = refined.areas.map(({ id }) => id);
|
|
167
|
+
const resizeIds = new Set(plan?.version === 2 ? plan.operations.flatMap((operation) => operation.method === "size-ratio" || operation.method === "mirror-symmetry" && operation.match === "geometry"
|
|
168
|
+
? [operation.targetAreaId] : []) : []);
|
|
169
|
+
const geometryInputs = (area) => resizeIds.has(area.id)
|
|
170
|
+
? { id: area.id, primitive: area.primitive } : areaGeometryInputs(area);
|
|
171
|
+
const directionMayRotate = plan?.version === 2 && plan.operations.some((operation) => operation.method === "focus-flow" && operation.sourceId === "direction-1");
|
|
172
|
+
const directionContent = (draft) => draft.directionLine && directionMayRotate
|
|
173
|
+
? { ...draft.directionLine, rotation: 0 } : draft.directionLine;
|
|
174
|
+
const preserved = {
|
|
175
|
+
processingSemantic: source.processingSemantic === refined.processingSemantic,
|
|
176
|
+
frame: equal(source.frame, refined.frame),
|
|
177
|
+
focusIdentity: equal(source.focusPoints.map(({ id }) => id), refined.focusPoints.map(({ id }) => id)),
|
|
178
|
+
areaIdentity: sourceAreaIds.length === refinedAreaIds.length &&
|
|
179
|
+
[...sourceAreaIds].sort().join("\u0000") === [...refinedAreaIds].sort().join("\u0000"),
|
|
180
|
+
areaGeometryInputs: equal(source.areas.map(geometryInputs), refined.areas.map(geometryInputs)),
|
|
181
|
+
areaMetadata: equal(source.areas.map(areaMetadata), refined.areas.map(areaMetadata)),
|
|
182
|
+
areaOrder: equal(sourceAreaIds, refinedAreaIds),
|
|
183
|
+
directionLine: equal(directionContent(source), directionContent(refined)),
|
|
184
|
+
clippingSides: equal(source.areas.map((area) => areaClippedSides(area, source)), refined.areas.map((area) => areaClippedSides(area, refined))),
|
|
185
|
+
};
|
|
186
|
+
// Clipping is an observed result of the Agent's geometry choices, not an invariant.
|
|
187
|
+
const failedChecks = Object.entries(preserved)
|
|
188
|
+
.filter(([name, passed]) => name !== "clippingSides" && !passed)
|
|
189
|
+
.map(([name]) => `preserved.${name}`);
|
|
190
|
+
if (source.overallNote !== refined.overallNote)
|
|
191
|
+
failedChecks.push("preserved.overallNote");
|
|
192
|
+
if (!equal(source.images, refined.images))
|
|
193
|
+
failedChecks.push("preserved.images");
|
|
194
|
+
const focusMetadata = (draft) => draft.focusPoints.map(({ x: _x, y: _y, ...metadata }) => metadata);
|
|
195
|
+
if (!equal(focusMetadata(source), focusMetadata(refined)))
|
|
196
|
+
failedChecks.push("preserved.focusMetadata");
|
|
197
|
+
return {
|
|
198
|
+
passed: failedChecks.length === 0,
|
|
199
|
+
changes,
|
|
200
|
+
preserved,
|
|
201
|
+
failedChecks,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function applyNamedRelation(draft, operation) {
|
|
205
|
+
if (operation.method !== "frame-placement" && operation.method !== "size-ratio"
|
|
206
|
+
&& operation.method !== "mirror-symmetry" && operation.method !== "focus-flow") {
|
|
207
|
+
throw new Error("Expected a named composition relation.");
|
|
208
|
+
}
|
|
209
|
+
const refined = applyRelation(draft, operation);
|
|
210
|
+
const items = [...draft.areas, ...draft.focusPoints, ...(draft.directionLine ? [draft.directionLine] : [])];
|
|
211
|
+
const changed = items.filter((item) => !equal(item, refinementItem(refined, item.id)));
|
|
212
|
+
return { draft: refined, applied: {
|
|
213
|
+
method: operation.method, methodVersion: 1, targetIds: changed.map(({ id }) => id),
|
|
214
|
+
positionShifts: Object.fromEntries(changed.map((item) => [item.id, frameDistance(item, refinementItem(refined, item.id), draft)])),
|
|
215
|
+
rotationShifts: Object.fromEntries(changed.filter((item) => "rotation" in item).map((item) => {
|
|
216
|
+
const next = refinementItem(refined, item.id);
|
|
217
|
+
return [item.id, Math.abs(angleDifference("rotation" in next ? next.rotation ?? 0 : 0, "rotation" in item ? item.rotation ?? 0 : 0))];
|
|
218
|
+
})),
|
|
219
|
+
} };
|
|
220
|
+
}
|
|
221
|
+
function applyFocusAnchor(draft, operation) {
|
|
222
|
+
if (operation.method !== "focus-anchor")
|
|
223
|
+
throw new Error("Invalid focus-anchor operation.");
|
|
224
|
+
const focus = draft.focusPoints.find(({ id }) => id === operation.targetFocusId);
|
|
225
|
+
if (!focus)
|
|
226
|
+
throw new Error(`Unknown focus point: ${operation.targetFocusId}.`);
|
|
227
|
+
const targetInFrame = FOCUS_ANCHORS[operation.anchor];
|
|
228
|
+
const target = framePointToCanvas(targetInFrame, draft.frame);
|
|
229
|
+
const shift = distance(canvasPointToFrame(focus, draft.frame), targetInFrame);
|
|
230
|
+
const refined = moveItem(draft, focus.id, target);
|
|
231
|
+
const refinedFocus = refined.focusPoints.find(({ id }) => id === focus.id);
|
|
232
|
+
if (distance(canvasPointToFrame(refinedFocus, draft.frame), targetInFrame) > EPSILON) {
|
|
233
|
+
throw new Error(`focus-anchor could not reach ${operation.anchor} within draft constraints.`);
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
draft: refined,
|
|
237
|
+
applied: {
|
|
238
|
+
method: operation.method,
|
|
239
|
+
methodVersion: 1,
|
|
240
|
+
targetIds: [focus.id],
|
|
241
|
+
positionShifts: { [focus.id]: round(shift) },
|
|
242
|
+
rotationShifts: {},
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function applyAxisRelation(draft, operation) {
|
|
247
|
+
if (operation.method !== "axis-relation")
|
|
248
|
+
throw new Error("Invalid axis-relation operation.");
|
|
249
|
+
const focuses = operation.focusIds.map((id) => {
|
|
250
|
+
const focus = draft.focusPoints.find((item) => item.id === id);
|
|
251
|
+
if (!focus)
|
|
252
|
+
throw new Error(`Unknown focus point: ${id}.`);
|
|
253
|
+
return focus;
|
|
254
|
+
});
|
|
255
|
+
const areas = operation.areaIds.map((id) => {
|
|
256
|
+
const area = draft.areas.find((item) => item.id === id);
|
|
257
|
+
if (!area)
|
|
258
|
+
throw new Error(`Unknown area: ${id}.`);
|
|
259
|
+
return area;
|
|
260
|
+
});
|
|
261
|
+
if (distance(focuses[0], focuses[1]) < EPSILON || distance(areas[0], areas[1]) < EPSILON) {
|
|
262
|
+
throw new Error("An axis relation requires distinct focus positions and distinct area centers.");
|
|
263
|
+
}
|
|
264
|
+
const focusAngle = axisAngle(focuses[0], focuses[1]);
|
|
265
|
+
const sourceAngle = axisAngle(areas[0], areas[1]);
|
|
266
|
+
const focusSlope = axisSlopeAngle(focusAngle);
|
|
267
|
+
const candidates = operation.relation === "parallel"
|
|
268
|
+
? [focusAngle, focusAngle + 180]
|
|
269
|
+
: operation.relation === "mirrored-cross"
|
|
270
|
+
? [-focusSlope, 180 - focusSlope]
|
|
271
|
+
: [focusAngle + 90, focusAngle - 90];
|
|
272
|
+
const targetAngle = candidates.sort((first, second) => Math.abs(angleDifference(first, sourceAngle)) - Math.abs(angleDifference(second, sourceAngle)))[0];
|
|
273
|
+
const first = toPixels(areas[0]);
|
|
274
|
+
const second = toPixels(areas[1]);
|
|
275
|
+
const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };
|
|
276
|
+
const halfDistance = distance(first, second) / 2;
|
|
277
|
+
const radians = (targetAngle * Math.PI) / 180;
|
|
278
|
+
const targets = [
|
|
279
|
+
{
|
|
280
|
+
x: (center.x - Math.cos(radians) * halfDistance) / COMPOSITION_CANVAS.width,
|
|
281
|
+
y: (center.y - Math.sin(radians) * halfDistance) / COMPOSITION_CANVAS.height,
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
x: (center.x + Math.cos(radians) * halfDistance) / COMPOSITION_CANVAS.width,
|
|
285
|
+
y: (center.y + Math.sin(radians) * halfDistance) / COMPOSITION_CANVAS.height,
|
|
286
|
+
},
|
|
287
|
+
];
|
|
288
|
+
const shifts = areas.map((area, index) => frameDistance(area, targets[index], draft));
|
|
289
|
+
let refined = draft;
|
|
290
|
+
areas.forEach((area, index) => {
|
|
291
|
+
refined = moveItem(refined, area.id, targets[index]);
|
|
292
|
+
});
|
|
293
|
+
const refinedAreas = operation.areaIds.map((id) => refined.areas.find((area) => area.id === id));
|
|
294
|
+
const refinedAngle = axisAngle(refinedAreas[0], refinedAreas[1]);
|
|
295
|
+
if (acuteAxisDifference(refinedAngle, targetAngle) > 1e-6) {
|
|
296
|
+
throw new Error("axis-relation could not reach the requested relation within draft constraints.");
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
draft: refined,
|
|
300
|
+
applied: {
|
|
301
|
+
method: operation.method,
|
|
302
|
+
methodVersion: 1,
|
|
303
|
+
targetIds: [...operation.focusIds, ...operation.areaIds],
|
|
304
|
+
positionShifts: Object.fromEntries(areas.map((area, index) => [area.id, round(shifts[index])])),
|
|
305
|
+
rotationShifts: {},
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function applyRotationAlignment(draft, operation) {
|
|
310
|
+
if (operation.method !== "rotation-alignment") {
|
|
311
|
+
throw new Error("Invalid rotation-alignment operation.");
|
|
312
|
+
}
|
|
313
|
+
const baseAngle = {
|
|
314
|
+
horizontal: 0,
|
|
315
|
+
vertical: 90,
|
|
316
|
+
"rising-diagonal": 315,
|
|
317
|
+
"falling-diagonal": 45,
|
|
318
|
+
}[operation.axis];
|
|
319
|
+
const targets = operation.targetAreaIds.map((id) => {
|
|
320
|
+
const area = draft.areas.find((item) => item.id === id);
|
|
321
|
+
if (!area)
|
|
322
|
+
throw new Error(`Unknown area: ${id}.`);
|
|
323
|
+
if (area.primitive === "circle") {
|
|
324
|
+
throw new Error(`rotation-alignment does not support circle area: ${id}.`);
|
|
325
|
+
}
|
|
326
|
+
const sourceRotation = area.rotation ?? 0;
|
|
327
|
+
const candidates = [baseAngle, (baseAngle + 180) % 360];
|
|
328
|
+
const targetRotation = candidates.sort((first, second) => Math.abs(angleDifference(first, sourceRotation)) -
|
|
329
|
+
Math.abs(angleDifference(second, sourceRotation)))[0];
|
|
330
|
+
const shift = Math.abs(angleDifference(targetRotation, sourceRotation));
|
|
331
|
+
return { area, targetRotation, shift };
|
|
332
|
+
});
|
|
333
|
+
let refined = draft;
|
|
334
|
+
targets.forEach(({ area, targetRotation }) => {
|
|
335
|
+
refined = rotateArea(refined, area.id, targetRotation);
|
|
336
|
+
});
|
|
337
|
+
return {
|
|
338
|
+
draft: refined,
|
|
339
|
+
applied: {
|
|
340
|
+
method: operation.method,
|
|
341
|
+
methodVersion: 1,
|
|
342
|
+
targetIds: [...operation.targetAreaIds],
|
|
343
|
+
positionShifts: {},
|
|
344
|
+
rotationShifts: Object.fromEntries(targets.map(({ area, shift }) => [area.id, round(shift)])),
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
function applyBlockAlignment(draft, operation) {
|
|
349
|
+
if (operation.method !== "block-alignment") {
|
|
350
|
+
throw new Error("Invalid block-alignment operation.");
|
|
351
|
+
}
|
|
352
|
+
if (!operation.targetAreaIds.includes(operation.anchorAreaId)) {
|
|
353
|
+
throw new Error("block-alignment anchorAreaId must be included in targetAreaIds.");
|
|
354
|
+
}
|
|
355
|
+
const areas = operation.targetAreaIds.map((id) => {
|
|
356
|
+
const area = draft.areas.find((candidate) => candidate.id === id);
|
|
357
|
+
if (!area)
|
|
358
|
+
throw new Error(`Unknown area: ${id}.`);
|
|
359
|
+
return area;
|
|
360
|
+
});
|
|
361
|
+
const anchor = areas.find(({ id }) => id === operation.anchorAreaId);
|
|
362
|
+
const anchorBounds = boundsForArea(anchor);
|
|
363
|
+
const anchorCoordinate = alignmentCoordinate(anchorBounds, operation.alignment);
|
|
364
|
+
const targets = areas.map((area) => {
|
|
365
|
+
const bounds = boundsForArea(area);
|
|
366
|
+
const coordinate = alignmentCoordinate(bounds, operation.alignment);
|
|
367
|
+
const horizontal = ["left", "horizontal-center", "right"].includes(operation.alignment);
|
|
368
|
+
const target = {
|
|
369
|
+
x: area.x + (horizontal ? anchorCoordinate - coordinate : 0) / COMPOSITION_CANVAS.width,
|
|
370
|
+
y: area.y + (horizontal ? 0 : anchorCoordinate - coordinate) / COMPOSITION_CANVAS.height,
|
|
371
|
+
};
|
|
372
|
+
return { area, target, shift: frameDistance(area, target, draft) };
|
|
373
|
+
});
|
|
374
|
+
let refined = draft;
|
|
375
|
+
targets.forEach(({ area, target }) => {
|
|
376
|
+
refined = moveItem(refined, area.id, target);
|
|
377
|
+
});
|
|
378
|
+
return {
|
|
379
|
+
draft: refined,
|
|
380
|
+
applied: {
|
|
381
|
+
method: operation.method,
|
|
382
|
+
methodVersion: 1,
|
|
383
|
+
targetIds: [...operation.targetAreaIds],
|
|
384
|
+
positionShifts: Object.fromEntries(targets.map(({ area, shift }) => [area.id, round(shift)])),
|
|
385
|
+
rotationShifts: {},
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function applySpacingRhythm(draft, operation) {
|
|
390
|
+
if (operation.method !== "spacing-rhythm") {
|
|
391
|
+
throw new Error("Invalid spacing-rhythm operation.");
|
|
392
|
+
}
|
|
393
|
+
const horizontal = operation.axis === "horizontal";
|
|
394
|
+
const areas = operation.targetAreaIds.map((id) => {
|
|
395
|
+
const area = draft.areas.find((candidate) => candidate.id === id);
|
|
396
|
+
if (!area)
|
|
397
|
+
throw new Error(`Unknown area: ${id}.`);
|
|
398
|
+
const bounds = boundsForArea(area);
|
|
399
|
+
return {
|
|
400
|
+
area,
|
|
401
|
+
minimum: horizontal ? bounds.minimumX : bounds.minimumY,
|
|
402
|
+
maximum: horizontal ? bounds.maximumX : bounds.maximumY,
|
|
403
|
+
};
|
|
404
|
+
}).sort((first, second) => ((first.minimum + first.maximum) - (second.minimum + second.maximum)));
|
|
405
|
+
const first = areas[0];
|
|
406
|
+
const last = areas.at(-1);
|
|
407
|
+
const totalSize = areas.reduce((sum, area) => sum + area.maximum - area.minimum, 0);
|
|
408
|
+
const gap = (last.maximum - first.minimum - totalSize) / (areas.length - 1);
|
|
409
|
+
let cursor = first.minimum;
|
|
410
|
+
const targets = areas.map(({ area, minimum, maximum }) => {
|
|
411
|
+
const size = maximum - minimum;
|
|
412
|
+
const targetCenter = cursor + size / 2;
|
|
413
|
+
const currentCenter = (minimum + maximum) / 2;
|
|
414
|
+
const target = {
|
|
415
|
+
x: area.x + (horizontal ? targetCenter - currentCenter : 0) / COMPOSITION_CANVAS.width,
|
|
416
|
+
y: area.y + (horizontal ? 0 : targetCenter - currentCenter) / COMPOSITION_CANVAS.height,
|
|
417
|
+
};
|
|
418
|
+
cursor += size + gap;
|
|
419
|
+
return { area, target, shift: frameDistance(area, target, draft) };
|
|
420
|
+
});
|
|
421
|
+
let refined = draft;
|
|
422
|
+
targets.forEach(({ area, target }) => {
|
|
423
|
+
refined = moveItem(refined, area.id, target);
|
|
424
|
+
});
|
|
425
|
+
return {
|
|
426
|
+
draft: refined,
|
|
427
|
+
applied: {
|
|
428
|
+
method: operation.method,
|
|
429
|
+
methodVersion: 1,
|
|
430
|
+
targetIds: [...operation.targetAreaIds],
|
|
431
|
+
positionShifts: Object.fromEntries(targets.map(({ area, shift }) => [area.id, round(shift)])),
|
|
432
|
+
rotationShifts: {},
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
function boundsForArea(area) {
|
|
437
|
+
return geometryBounds(areaGeometry(area, COMPOSITION_CANVAS));
|
|
438
|
+
}
|
|
439
|
+
function alignmentCoordinate(bounds, alignment) {
|
|
440
|
+
if (alignment === "left")
|
|
441
|
+
return bounds.minimumX;
|
|
442
|
+
if (alignment === "horizontal-center")
|
|
443
|
+
return (bounds.minimumX + bounds.maximumX) / 2;
|
|
444
|
+
if (alignment === "right")
|
|
445
|
+
return bounds.maximumX;
|
|
446
|
+
if (alignment === "top")
|
|
447
|
+
return bounds.minimumY;
|
|
448
|
+
if (alignment === "vertical-center")
|
|
449
|
+
return (bounds.minimumY + bounds.maximumY) / 2;
|
|
450
|
+
return bounds.maximumY;
|
|
451
|
+
}
|
|
452
|
+
function areaGeometryInputs(area) {
|
|
453
|
+
return {
|
|
454
|
+
id: area.id,
|
|
455
|
+
primitive: area.primitive,
|
|
456
|
+
area: area.area,
|
|
457
|
+
aspect: area.aspect,
|
|
458
|
+
width: area.width,
|
|
459
|
+
height: area.height,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
function areaMetadata(area) {
|
|
463
|
+
return {
|
|
464
|
+
id: area.id,
|
|
465
|
+
origin: area.origin,
|
|
466
|
+
note: area.note,
|
|
467
|
+
annotation: area.annotation,
|
|
468
|
+
semanticType: area.semanticType,
|
|
469
|
+
shotScale: area.shotScale,
|
|
470
|
+
visualWeight: area.visualWeight,
|
|
471
|
+
displayText: area.displayText,
|
|
472
|
+
isLightSource: area.isLightSource ?? false,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
function axisAngle(first, second) {
|
|
476
|
+
const start = toPixels(first);
|
|
477
|
+
const end = toPixels(second);
|
|
478
|
+
return (Math.atan2(end.y - start.y, end.x - start.x) * 180) / Math.PI;
|
|
479
|
+
}
|
|
480
|
+
function axisSlopeAngle(angle) {
|
|
481
|
+
return ((angle + 270) % 180) - 90;
|
|
482
|
+
}
|
|
483
|
+
function angleDifference(first, second) {
|
|
484
|
+
return ((first - second + 540) % 360) - 180;
|
|
485
|
+
}
|
|
486
|
+
function acuteAxisDifference(first, second) {
|
|
487
|
+
const difference = Math.abs(angleDifference(first, second));
|
|
488
|
+
return Math.min(difference, 180 - difference);
|
|
489
|
+
}
|
|
490
|
+
function toPixels(point) {
|
|
491
|
+
return {
|
|
492
|
+
x: point.x * COMPOSITION_CANVAS.width,
|
|
493
|
+
y: point.y * COMPOSITION_CANVAS.height,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
function frameDistance(first, second, draft) {
|
|
497
|
+
return distance(canvasPointToFrame(first, draft.frame), canvasPointToFrame(second, draft.frame));
|
|
498
|
+
}
|
|
499
|
+
function distance(first, second) {
|
|
500
|
+
return Math.hypot(first.x - second.x, first.y - second.y);
|
|
501
|
+
}
|
|
502
|
+
function maximum(values) {
|
|
503
|
+
return Math.max(0, ...values);
|
|
504
|
+
}
|
|
505
|
+
function equal(first, second) {
|
|
506
|
+
return JSON.stringify(first) === JSON.stringify(second);
|
|
507
|
+
}
|
|
508
|
+
function round(value) {
|
|
509
|
+
return Math.round(value * 1e6) / 1e6;
|
|
510
|
+
}
|
|
511
|
+
function formatValidationErrors(errors) {
|
|
512
|
+
return (errors ?? [])
|
|
513
|
+
.map((error) => {
|
|
514
|
+
if (error.keyword === "additionalProperties") {
|
|
515
|
+
return `${error.instancePath || "plan"} contains unknown field: ${String(error.params.additionalProperty)}`;
|
|
516
|
+
}
|
|
517
|
+
return `${error.instancePath || "plan"} ${error.message ?? "is invalid"}`;
|
|
518
|
+
})
|
|
519
|
+
.join("; ");
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/domain/composition/refinement/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompositionArea, CompositionDraft, DirectionLine, FocusPoint } from "../types.ts";
|
|
2
|
+
import type { CompositionRefinementOperation, DirectedRefinementPlan, FrameDivision, RefinementRelationCheck, RelationOperation } from "./types.ts";
|
|
3
|
+
export declare const FRAME_DIVISIONS: Record<FrameDivision, number>;
|
|
4
|
+
export declare function refinementItem(draft: CompositionDraft, id: string): CompositionArea | FocusPoint | DirectionLine;
|
|
5
|
+
export declare function refinementArea(draft: CompositionDraft, id: string): CompositionArea;
|
|
6
|
+
/** Unrotated dimensions in the common physical coordinate system, not frame fractions. */
|
|
7
|
+
export declare function areaDimensions(area: CompositionArea): {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function angleError(first: number, second: number): number;
|
|
12
|
+
export declare function applyRelation(draft: CompositionDraft, operation: RelationOperation): CompositionDraft;
|
|
13
|
+
/** Linked focuses retain their local position when their subject is transformed. Moving a linked focus translates its subject. */
|
|
14
|
+
export declare function carryLinkedFocuses(before: CompositionDraft, after: CompositionDraft, plan: DirectedRefinementPlan): CompositionDraft;
|
|
15
|
+
export declare function validateRefinementLinks(draft: CompositionDraft, plan: DirectedRefinementPlan): void;
|
|
16
|
+
export declare function checkRefinementRelation(source: CompositionDraft, final: CompositionDraft, operation: CompositionRefinementOperation, operationIndex: number, execute: (draft: CompositionDraft, operation: CompositionRefinementOperation) => CompositionDraft): RefinementRelationCheck;
|