@motionscript/grids 0.1.0 → 0.1.1-alpha.1
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/CHANGELOG.md +21 -0
- package/dist/browser/chunks/chunk-7SRKSZ7X.js +2 -0
- package/dist/browser/chunks/chunk-7SRKSZ7X.js.map +7 -0
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +2 -2
- package/dist/browser/kit.js +1 -1
- package/dist/browser/manifest.json +1 -1
- package/dist/engine.d.ts +0 -11
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +3 -11
- package/dist/engine.js.map +1 -1
- package/dist/kit/index.d.ts +0 -1
- package/dist/kit/index.d.ts.map +1 -1
- package/dist/kit/index.js +0 -2
- package/dist/kit/index.js.map +1 -1
- package/dist/kit/item-effects.d.ts +2 -5
- package/dist/kit/item-effects.d.ts.map +1 -1
- package/dist/kit/item-effects.js +5 -7
- package/dist/kit/item-effects.js.map +1 -1
- package/dist/kit/item-grid.d.ts +4 -48
- package/dist/kit/item-grid.d.ts.map +1 -1
- package/dist/kit/item-grid.js +4 -15
- package/dist/kit/item-grid.js.map +1 -1
- package/dist/kit/order.d.ts +3 -5
- package/dist/kit/order.d.ts.map +1 -1
- package/dist/kit/order.js +3 -5
- package/dist/kit/order.js.map +1 -1
- package/dist/kit/random.d.ts +0 -2
- package/dist/kit/random.d.ts.map +1 -1
- package/dist/kit/random.js +1 -1
- package/dist/kit/random.js.map +1 -1
- package/dist/kit/slots/index.d.ts +0 -1
- package/dist/kit/slots/index.d.ts.map +1 -1
- package/dist/kit/slots/index.js.map +1 -1
- package/dist/kit/slots/path-templates.d.ts +1 -6
- package/dist/kit/slots/path-templates.d.ts.map +1 -1
- package/dist/kit/slots/path-templates.js +1 -6
- package/dist/kit/slots/path-templates.js.map +1 -1
- package/dist/kit/slots/path.d.ts.map +1 -1
- package/dist/kit/slots/path.js +6 -9
- package/dist/kit/slots/path.js.map +1 -1
- package/dist/kit/slots/radial.d.ts +3 -5
- package/dist/kit/slots/radial.d.ts.map +1 -1
- package/dist/kit/slots/radial.js +3 -5
- package/dist/kit/slots/radial.js.map +1 -1
- package/dist/kit/slots/rectangular.d.ts +1 -5
- package/dist/kit/slots/rectangular.d.ts.map +1 -1
- package/dist/kit/slots/rectangular.js +1 -5
- package/dist/kit/slots/rectangular.js.map +1 -1
- package/dist/kit/slots/slot.d.ts +1 -7
- package/dist/kit/slots/slot.d.ts.map +1 -1
- package/dist/kit/slots/slot.js.map +1 -1
- package/dist/kit/stagger.d.ts +2 -13
- package/dist/kit/stagger.d.ts.map +1 -1
- package/dist/kit/stagger.js +2 -13
- package/dist/kit/stagger.js.map +1 -1
- package/dist/nodes.d.ts +0 -12
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js.map +1 -1
- package/dist/path-grid/path-grid.d.ts +0 -3
- package/dist/path-grid/path-grid.d.ts.map +1 -1
- package/dist/path-grid/path-grid.js.map +1 -1
- package/dist/radial-grid/radial-grid.d.ts +0 -2
- package/dist/radial-grid/radial-grid.d.ts.map +1 -1
- package/dist/radial-grid/radial-grid.js.map +1 -1
- package/dist/rectangular-grid/rectangular-grid.d.ts +0 -2
- package/dist/rectangular-grid/rectangular-grid.d.ts.map +1 -1
- package/dist/rectangular-grid/rectangular-grid.js.map +1 -1
- package/dist/sphere-grid/sphere-grid.d.ts +0 -2
- package/dist/sphere-grid/sphere-grid.d.ts.map +1 -1
- package/dist/sphere-grid/sphere-grid.js.map +1 -1
- package/package.json +4 -4
- package/src/engine.ts +3 -11
- package/src/kit/index.ts +0 -3
- package/src/kit/item-effects.ts +6 -13
- package/src/kit/item-grid.ts +15 -52
- package/src/kit/order.ts +3 -6
- package/src/kit/random.ts +1 -1
- package/src/kit/slots/index.ts +0 -2
- package/src/kit/slots/path-templates.ts +1 -6
- package/src/kit/slots/path.ts +6 -10
- package/src/kit/slots/radial.ts +3 -5
- package/src/kit/slots/rectangular.ts +1 -5
- package/src/kit/slots/slot.ts +1 -7
- package/src/kit/stagger.ts +2 -13
- package/src/nodes.ts +0 -12
- package/src/path-grid/path-grid.ts +0 -3
- package/src/radial-grid/radial-grid.ts +0 -2
- package/src/rectangular-grid/rectangular-grid.ts +0 -2
- package/src/sphere-grid/sphere-grid.ts +0 -2
- package/dist/browser/chunks/chunk-TYNFMZ3D.js +0 -2
- package/dist/browser/chunks/chunk-TYNFMZ3D.js.map +0 -7
package/dist/nodes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,KAAK,OAAO,GACR,OAAO,eAAe,GACtB,OAAO,UAAU,GACjB,OAAO,QAAQ,GACf,OAAO,UAAU,CAAA;AAErB,eAAO,MAAM,KAAK,EAAE,OAAO,EAK1B,CAAA"}
|
package/dist/nodes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAS1C,MAAM,CAAC,MAAM,KAAK,GAAc;IAC9B,eAAe;IACf,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAA","sourcesContent":["import { PathGrid } from \"./path-grid\"\nimport { RadialGrid } from \"./radial-grid\"\nimport { RectangularGrid } from \"./rectangular-grid\"\nimport { SphereGrid } from \"./sphere-grid\"\n\n// Typed by name, so the declaration names each component rather than spelling out its type through core.\ntype KitNode =\n | typeof RectangularGrid\n | typeof RadialGrid\n | typeof PathGrid\n | typeof SphereGrid\n\nexport const NODES: KitNode[] = [\n RectangularGrid,\n RadialGrid,\n PathGrid,\n SphereGrid,\n]\n"]}
|
|
@@ -2,7 +2,6 @@ import { type NodeOf, type NodeView, type PathData, type Node2D as _Node2D, type
|
|
|
2
2
|
import { ItemGrid } from "../kit/index.js";
|
|
3
3
|
/** A template, or `custom` for the grid's own `path`. */
|
|
4
4
|
export declare const PATH_GRID_SHAPES: readonly ["circle", "square", "star", "heart", "infinity", "wave", "spiral", "arc", "line", "custom"];
|
|
5
|
-
export type PathGridShape = (typeof PATH_GRID_SHAPES)[number];
|
|
6
5
|
/**
|
|
7
6
|
* Children along a path: one of the templates drawn to fill the node's box,
|
|
8
7
|
* a path of the grid's own, or a path node elsewhere in the scene, followed
|
|
@@ -191,6 +190,4 @@ export declare const PathGrid: import("@motionscript/sdk").Component<"pathGrid",
|
|
|
191
190
|
};
|
|
192
191
|
}, _Node2D<_Node2DProps>>>>;
|
|
193
192
|
export type PathGrid = NodeOf<typeof PathGrid>;
|
|
194
|
-
/** What a call or a document row may set. */
|
|
195
|
-
export type PathGridProps = NonNullable<Parameters<typeof PathGrid>[0]>;
|
|
196
193
|
//# sourceMappingURL=path-grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-grid.d.ts","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EAIb,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,QAAQ,EAST,MAAM,QAAQ,CAAA;AAEf,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,uGAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"path-grid.d.ts","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,QAAQ,EAIb,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,QAAQ,EAST,MAAM,QAAQ,CAAA;AAEf,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,uGAAyC,CAAA;AA4CtE;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2CR,CAAA;AAEb,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-grid.js","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n pathOps,\n Types,\n type NodeOf,\n type NodeView,\n type PathData,\n type Size2D,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n PATH_SPACINGS,\n PATH_TEMPLATES,\n staggerArgs,\n TRANSITION_STAGGER,\n templatePath,\n type PathArrangement,\n type PathPlacement,\n type PathTemplate,\n} from \"../kit\"\n\n/** A template, or `custom` for the grid's own `path`. */\nexport const PATH_GRID_SHAPES = [...PATH_TEMPLATES, \"custom\"] as const\nexport type PathGridShape = (typeof PATH_GRID_SHAPES)[number]\n\nconst own = {\n shape: Types.oneOf(PATH_GRID_SHAPES, { default: \"circle\" }),\n /** Used when `shape` is `custom`: an SVG path, y-down as SVG writes one, centred on its own bounds. */\n path: Types.path,\n /** A path node to follow instead, by id — the items track it wherever it goes. */\n pathNode: ItemGrid.nodeRef([\"path\"]),\n spacing: Types.oneOf(PATH_SPACINGS, { default: \"distribute\" }),\n spacingDistance: Types.number(80, { min: 0, step: 1 }),\n /** Share of the path the items are moved along — `1` is once round. */\n offset: Types.number(0, { step: 0.01 }),\n /** Share of the path per second the items travel on their own. */\n flowSpeed: Types.number(0, { step: 0.01, unit: \"/s\" }),\n trimStart: Types.number(0, { min: 0, max: 1, step: 0.01 }),\n trimEnd: Types.number(1, { min: 0, max: 1, step: 0.01 }),\n alignToPath: true,\n}\n\ntype Own = Values<typeof own>\n\nconst AT_ORIGIN: PathPlacement = { originX: 0, originY: 0, x: 0, y: 0, rotation: 0, scale: 1 }\n\n/** The size a path grid is placed at when nothing says otherwise, since a template is drawn to fill it. */\nconst DEFAULT_SIZE = { width: 640, height: 400 }\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement: (s, box): PathArrangement => {\n const { path, placement } = pathIn(s, box)\n return {\n kind: \"path\",\n path,\n placement,\n spacing: s.spacing,\n spacingDistance: s.spacingDistance,\n offset: s.offset,\n flowSpeed: s.flowSpeed,\n trimStart: s.trimStart,\n trimEnd: s.trimEnd,\n alignToPath: s.alignToPath,\n }\n },\n}\n\n/**\n * Children along a path: one of the templates drawn to fill the node's box,\n * a path of the grid's own, or a path node elsewhere in the scene, followed\n * wherever it is.\n *\n * Items are spaced by distance along the curve, so they sit evenly on a tight\n * bend and a straight alike. Animating `offset` moves them along it — on a\n * closed path they come round again, which is a conveyor belt for free.\n */\nexport const PathGrid = ItemGrid.define(component2d({\n key: \"pathGrid\",\n state: { ...ItemGrid.state, ...own },\n // A template is drawn to fill the box, so a path grid needs one of its own\n // rather than hugging items whose places depend on it.\n defaults: { ...DEFAULT_SIZE },\n commands: {\n ...ItemGrid.commands,\n /** Move the items along the path by `loops` — `1` is once round, and they keep their spacing. */\n flow: {\n args: { loops: Types.number(1, { step: 0.25 }) },\n run: (timeline, s) => timeline.tween({ offset: s.offset + (timeline.args.loops ?? 1) }),\n },\n /** Squeeze the items into part of the path, between two shares of its length. */\n trimTo: {\n args: {\n trimStart: ItemGrid.hinted(0.25, { min: 0, max: 1, step: 0.01 }),\n trimEnd: ItemGrid.hinted(0.75, { min: 0, max: 1, step: 0.01 }),\n },\n run: (timeline, s) => timeline.tween({\n trimStart: timeline.args.trimStart ?? s.trimStart,\n trimEnd: timeline.args.trimEnd ?? s.trimEnd,\n }),\n },\n /**\n * Move the items onto another path — a template, or a path node in the\n * scene. Each item travels from its place on the old path to its place on\n * the new one; the path itself is not morphed.\n */\n setPath: {\n args: {\n shape: ItemGrid.hinted(\"heart\", { kind: \"enum\", options: PATH_GRID_SHAPES }),\n pathNode: ItemGrid.nodeRefArg([\"path\"]),\n ...staggerArgs(TRANSITION_STAGGER),\n },\n run: (timeline, s, children) => {\n const pathNode = timeline.args.pathNode ?? \"\"\n const changes = pathNode ? { pathNode } : { shape: timeline.args.shape ?? s.shape, pathNode: \"\" }\n return ItemGrid.transitionTo(timeline as never, s, children, changes)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type PathGrid = NodeOf<typeof PathGrid>\n/** What a call or a document row may set. */\nexport type PathGridProps = NonNullable<Parameters<typeof PathGrid>[0]>\n\n/** The path the items follow, and where its coordinates land in this grid's frame. */\nfunction pathIn(s: Own, box: Size2D): { path: PathData; placement: PathPlacement } {\n const linked = s.pathNode\n // A document `path` draws its data in its own unit box, at its own position.\n if (linked?.key === \"path\") return { path: unitPath(linked), placement: { ...AT_ORIGIN, ...linked.frame } }\n // A face-value path draws its data centred on the data's own bounds, at its own position.\n const data = linked?.key === \"facePath\" ? dataOf(linked) : undefined\n const bounds = data !== undefined ? pathOps.bounds(data) : null\n if (linked && data !== undefined && bounds) {\n return {\n path: data,\n placement: {\n originX: (bounds.minX + bounds.maxX) / 2,\n originY: (bounds.minY + bounds.maxY) / 2,\n ...linked.frame,\n },\n }\n }\n if (s.shape === \"custom\") {\n const own = pathOps.bounds(s.path)\n if (own) {\n return {\n path: s.path,\n placement: {\n ...AT_ORIGIN,\n originX: (own.minX + own.maxX) / 2,\n originY: (own.minY + own.maxY) / 2,\n flipY: true,\n },\n }\n }\n }\n const template: PathTemplate = s.shape === \"custom\" ? \"circle\" : s.shape\n return { path: templatePath(template, box), placement: AT_ORIGIN }\n}\n\nfunction dataOf(view: NodeView): PathData {\n return (view.state as { readonly data: PathData }).data\n}\n\nconst unitPaths = new WeakMap<NodeView, { data: PathData; width: number; height: number; path: PathData }>()\n\n/**\n * A path node's geometry as it draws it: stored in its unit box, y-down, and\n * scaled to its laid-out size — kept while neither changes, so the path's\n * measurement is kept with it.\n */\nfunction unitPath(view: NodeView): PathData {\n const data = dataOf(view)\n const { width, height } = view.size\n const cached = unitPaths.get(view)\n if (cached && cached.data === data && cached.width === width && cached.height === height) return cached.path\n const path = pathOps.anchorCommands(pathOps.anchors(data), (p) => ({ x: p.x * width, y: -p.y * height }))\n unitPaths.set(view, { data, width, height, path })\n return path\n}\n"]}
|
|
1
|
+
{"version":3,"file":"path-grid.js","sourceRoot":"","sources":["../../src/path-grid/path-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n pathOps,\n Types,\n type NodeOf,\n type NodeView,\n type PathData,\n type Size2D,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n PATH_SPACINGS,\n PATH_TEMPLATES,\n staggerArgs,\n TRANSITION_STAGGER,\n templatePath,\n type PathArrangement,\n type PathPlacement,\n type PathTemplate,\n} from \"../kit\"\n\n/** A template, or `custom` for the grid's own `path`. */\nexport const PATH_GRID_SHAPES = [...PATH_TEMPLATES, \"custom\"] as const\n\nconst own = {\n shape: Types.oneOf(PATH_GRID_SHAPES, { default: \"circle\" }),\n /** Used when `shape` is `custom`: an SVG path, y-down as SVG writes one, centred on its own bounds. */\n path: Types.path,\n /** A path node to follow instead, by id — the items track it wherever it goes. */\n pathNode: ItemGrid.nodeRef([\"path\"]),\n spacing: Types.oneOf(PATH_SPACINGS, { default: \"distribute\" }),\n spacingDistance: Types.number(80, { min: 0, step: 1 }),\n /** Share of the path the items are moved along — `1` is once round. */\n offset: Types.number(0, { step: 0.01 }),\n /** Share of the path per second the items travel on their own. */\n flowSpeed: Types.number(0, { step: 0.01, unit: \"/s\" }),\n trimStart: Types.number(0, { min: 0, max: 1, step: 0.01 }),\n trimEnd: Types.number(1, { min: 0, max: 1, step: 0.01 }),\n alignToPath: true,\n}\n\ntype Own = Values<typeof own>\n\nconst AT_ORIGIN: PathPlacement = { originX: 0, originY: 0, x: 0, y: 0, rotation: 0, scale: 1 }\n\n/** The size a path grid is placed at when nothing says otherwise, since a template is drawn to fill it. */\nconst DEFAULT_SIZE = { width: 640, height: 400 }\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement: (s, box): PathArrangement => {\n const { path, placement } = pathIn(s, box)\n return {\n kind: \"path\",\n path,\n placement,\n spacing: s.spacing,\n spacingDistance: s.spacingDistance,\n offset: s.offset,\n flowSpeed: s.flowSpeed,\n trimStart: s.trimStart,\n trimEnd: s.trimEnd,\n alignToPath: s.alignToPath,\n }\n },\n}\n\n/**\n * Children along a path: one of the templates drawn to fill the node's box,\n * a path of the grid's own, or a path node elsewhere in the scene, followed\n * wherever it is.\n *\n * Items are spaced by distance along the curve, so they sit evenly on a tight\n * bend and a straight alike. Animating `offset` moves them along it — on a\n * closed path they come round again, which is a conveyor belt for free.\n */\nexport const PathGrid = ItemGrid.define(component2d({\n key: \"pathGrid\",\n state: { ...ItemGrid.state, ...own },\n // A template is drawn to fill the box, so a path grid needs one of its own\n // rather than hugging items whose places depend on it.\n defaults: { ...DEFAULT_SIZE },\n commands: {\n ...ItemGrid.commands,\n /** Move the items along the path by `loops` — `1` is once round, and they keep their spacing. */\n flow: {\n args: { loops: Types.number(1, { step: 0.25 }) },\n run: (timeline, s) => timeline.tween({ offset: s.offset + (timeline.args.loops ?? 1) }),\n },\n /** Squeeze the items into part of the path, between two shares of its length. */\n trimTo: {\n args: {\n trimStart: ItemGrid.hinted(0.25, { min: 0, max: 1, step: 0.01 }),\n trimEnd: ItemGrid.hinted(0.75, { min: 0, max: 1, step: 0.01 }),\n },\n run: (timeline, s) => timeline.tween({\n trimStart: timeline.args.trimStart ?? s.trimStart,\n trimEnd: timeline.args.trimEnd ?? s.trimEnd,\n }),\n },\n /**\n * Move the items onto another path — a template, or a path node in the\n * scene. Each item travels from its place on the old path to its place on\n * the new one; the path itself is not morphed.\n */\n setPath: {\n args: {\n shape: ItemGrid.hinted(\"heart\", { kind: \"enum\", options: PATH_GRID_SHAPES }),\n pathNode: ItemGrid.nodeRefArg([\"path\"]),\n ...staggerArgs(TRANSITION_STAGGER),\n },\n run: (timeline, s, children) => {\n const pathNode = timeline.args.pathNode ?? \"\"\n const changes = pathNode ? { pathNode } : { shape: timeline.args.shape ?? s.shape, pathNode: \"\" }\n return ItemGrid.transitionTo(timeline as never, s, children, changes)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type PathGrid = NodeOf<typeof PathGrid>\n\n/** The path the items follow, and where its coordinates land in this grid's frame. */\nfunction pathIn(s: Own, box: Size2D): { path: PathData; placement: PathPlacement } {\n const linked = s.pathNode\n // A document `path` draws its data in its own unit box, at its own position.\n if (linked?.key === \"path\") return { path: unitPath(linked), placement: { ...AT_ORIGIN, ...linked.frame } }\n // A face-value path draws its data centred on the data's own bounds, at its own position.\n const data = linked?.key === \"facePath\" ? dataOf(linked) : undefined\n const bounds = data !== undefined ? pathOps.bounds(data) : null\n if (linked && data !== undefined && bounds) {\n return {\n path: data,\n placement: {\n originX: (bounds.minX + bounds.maxX) / 2,\n originY: (bounds.minY + bounds.maxY) / 2,\n ...linked.frame,\n },\n }\n }\n if (s.shape === \"custom\") {\n const own = pathOps.bounds(s.path)\n if (own) {\n return {\n path: s.path,\n placement: {\n ...AT_ORIGIN,\n originX: (own.minX + own.maxX) / 2,\n originY: (own.minY + own.maxY) / 2,\n flipY: true,\n },\n }\n }\n }\n const template: PathTemplate = s.shape === \"custom\" ? \"circle\" : s.shape\n return { path: templatePath(template, box), placement: AT_ORIGIN }\n}\n\nfunction dataOf(view: NodeView): PathData {\n return (view.state as { readonly data: PathData }).data\n}\n\nconst unitPaths = new WeakMap<NodeView, { data: PathData; width: number; height: number; path: PathData }>()\n\n/**\n * A path node's geometry as it draws it: stored in its unit box, y-down, and\n * scaled to its laid-out size — kept while neither changes, so the path's\n * measurement is kept with it.\n */\nfunction unitPath(view: NodeView): PathData {\n const data = dataOf(view)\n const { width, height } = view.size\n const cached = unitPaths.get(view)\n if (cached && cached.data === data && cached.width === width && cached.height === height) return cached.path\n const path = pathOps.anchorCommands(pathOps.anchors(data), (p) => ({ x: p.x * width, y: -p.y * height }))\n unitPaths.set(view, { data, width, height, path })\n return path\n}\n"]}
|
|
@@ -172,6 +172,4 @@ export declare const RadialGrid: import("@motionscript/sdk").Component<"radialGr
|
|
|
172
172
|
};
|
|
173
173
|
}, _Node2D<_Node2DProps>>>>;
|
|
174
174
|
export type RadialGrid = NodeOf<typeof RadialGrid>;
|
|
175
|
-
/** What a call or a document row may set. */
|
|
176
|
-
export type RadialGridProps = NonNullable<Parameters<typeof RadialGrid>[0]>;
|
|
177
175
|
//# sourceMappingURL=radial-grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radial-grid.d.ts","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,QAAQ,EAA8E,MAAM,QAAQ,CAAA;AA2B7G;;;;;;GAMG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAgCV,CAAA;AAEb,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"radial-grid.d.ts","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,QAAQ,EAA8E,MAAM,QAAQ,CAAA;AA2B7G;;;;;;GAMG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAgCV,CAAA;AAEb,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radial-grid.js","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport { ItemGrid, normalizeOrder, RADIAL_DIRECTIONS, radialTurnToTop, type RadialArrangement } from \"../kit\"\n\nconst own = {\n radius: Types.number(200, { min: 0, step: 1 }),\n startAngle: Types.number(0, { step: 1, unit: \"°\" }),\n sweep: Types.number(360, { min: -360, max: 360, step: 1, unit: \"°\" }),\n direction: Types.oneOf(RADIAL_DIRECTIONS, { default: \"clockwise\" }),\n rotateItems: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RadialArrangement {\n return {\n kind: \"radial\",\n radius: s.radius,\n startAngle: s.startAngle,\n sweep: s.sweep,\n direction: s.direction,\n rotateItems: s.rotateItems,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\n/**\n * Children round a circle, or along an arc of one.\n *\n * A full circle spaces the items evenly with none on top of another; an arc\n * puts one at each end. Angles run clockwise from twelve o'clock, so `turnTo`\n * can bring any item to the top like a dial.\n */\nexport const RadialGrid = ItemGrid.define(component2d({\n key: \"radialGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Orbit the items round the centre by `degrees` — `360` is one full turn. */\n spin: {\n args: { degrees: Types.number(360, { step: 15, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ startAngle: s.startAngle + (timeline.args.degrees ?? 360) }),\n },\n /** Turn the ring the shorter way round until an item (by its place in the layers) sits at the top. */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n const turn = slot < 0 ? 0 : radialTurnToTop(arrangement(s), count, slot)\n return timeline.tween({ startAngle: s.startAngle + turn })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(280, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Open or close the arc like a fan — from `0` to `360` is a reveal of its own. */\n sweepTo: {\n args: { sweep: ItemGrid.hinted(360, { min: -360, max: 360, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ sweep: timeline.args.sweep ?? s.sweep }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RadialGrid = NodeOf<typeof RadialGrid>\n
|
|
1
|
+
{"version":3,"file":"radial-grid.js","sourceRoot":"","sources":["../../src/radial-grid/radial-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport { ItemGrid, normalizeOrder, RADIAL_DIRECTIONS, radialTurnToTop, type RadialArrangement } from \"../kit\"\n\nconst own = {\n radius: Types.number(200, { min: 0, step: 1 }),\n startAngle: Types.number(0, { step: 1, unit: \"°\" }),\n sweep: Types.number(360, { min: -360, max: 360, step: 1, unit: \"°\" }),\n direction: Types.oneOf(RADIAL_DIRECTIONS, { default: \"clockwise\" }),\n rotateItems: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RadialArrangement {\n return {\n kind: \"radial\",\n radius: s.radius,\n startAngle: s.startAngle,\n sweep: s.sweep,\n direction: s.direction,\n rotateItems: s.rotateItems,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\n/**\n * Children round a circle, or along an arc of one.\n *\n * A full circle spaces the items evenly with none on top of another; an arc\n * puts one at each end. Angles run clockwise from twelve o'clock, so `turnTo`\n * can bring any item to the top like a dial.\n */\nexport const RadialGrid = ItemGrid.define(component2d({\n key: \"radialGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Orbit the items round the centre by `degrees` — `360` is one full turn. */\n spin: {\n args: { degrees: Types.number(360, { step: 15, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ startAngle: s.startAngle + (timeline.args.degrees ?? 360) }),\n },\n /** Turn the ring the shorter way round until an item (by its place in the layers) sits at the top. */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n const turn = slot < 0 ? 0 : radialTurnToTop(arrangement(s), count, slot)\n return timeline.tween({ startAngle: s.startAngle + turn })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(280, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Open or close the arc like a fan — from `0` to `360` is a reveal of its own. */\n sweepTo: {\n args: { sweep: ItemGrid.hinted(360, { min: -360, max: 360, unit: \"°\" }) },\n run: (timeline, s) => timeline.tween({ sweep: timeline.args.sweep ?? s.sweep }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RadialGrid = NodeOf<typeof RadialGrid>\n"]}
|
|
@@ -207,6 +207,4 @@ export declare const RectangularGrid: import("@motionscript/sdk").Component<"rec
|
|
|
207
207
|
};
|
|
208
208
|
}, _Node2D<_Node2DProps>>>>;
|
|
209
209
|
export type RectangularGrid = NodeOf<typeof RectangularGrid>;
|
|
210
|
-
/** What a call or a document row may set. */
|
|
211
|
-
export type RectangularGridProps = NonNullable<Parameters<typeof RectangularGrid>[0]>;
|
|
212
210
|
//# sourceMappingURL=rectangular-grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rectangular-grid.d.ts","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAGL,QAAQ,EAMT,MAAM,QAAQ,CAAA;AA6Cf;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmEf,CAAA;AAEb,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"rectangular-grid.d.ts","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAGL,QAAQ,EAMT,MAAM,QAAQ,CAAA;AA6Cf;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmEf,CAAA;AAEb,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rectangular-grid.js","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n easeInOut,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n CELL_MODES,\n FILL_DIRECTIONS,\n ItemGrid,\n LINE_ALIGNS,\n rectangularCell,\n staggerArgs,\n TRANSITION_STAGGER,\n type RectangularArrangement,\n} from \"../kit\"\n\nconst own = {\n columns: Types.number(3, { min: 1, step: 1 }),\n fillDirection: Types.oneOf(FILL_DIRECTIONS, { default: \"row\" }),\n cellMode: Types.oneOf(CELL_MODES, { default: \"fit\" }),\n cellWidth: Types.number(120, { min: 0, step: 1 }),\n cellHeight: Types.number(120, { min: 0, step: 1 }),\n columnGap: Types.number(24, { step: 1 }),\n rowGap: Types.number(24, { step: 1 }),\n lastLineAlign: Types.oneOf(LINE_ALIGNS, { default: \"start\" }),\n rowOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n columnOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RectangularArrangement {\n return {\n kind: \"rectangular\",\n columns: s.columns,\n fillDirection: s.fillDirection,\n cellMode: s.cellMode,\n cellWidth: s.cellWidth,\n cellHeight: s.cellHeight,\n columnGap: s.columnGap,\n rowGap: s.rowGap,\n lastLineAlign: s.lastLineAlign,\n rowOffset: s.rowOffset,\n columnOffset: s.columnOffset,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement,\n // A child set to fill takes its cell, where the cell is not simply the largest child.\n itemSpace: (s, count, space) => (s.cellMode === \"fit\" ? space : rectangularCell(arrangement(s), count, [], space)),\n}\n\n/** The focus args of a row or a column: the grow a row leaves out is the shared focus's. */\nconst lineFocus = {\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\n grow: ItemGrid.hinted(0.1, { min: 0, max: 1, step: 0.05 }),\n}\n\n/**\n * Children in rows and columns — the grid the other three are variations on.\n *\n * Cells are as big as the largest child (`fit`), a size of their own\n * (`fixed`), or an equal share of the node's box (`fill`), which is also the\n * room a child set to fill grows into. Shift every other row by half a cell\n * for a brick bond or a hex pack.\n */\nexport const RectangularGrid = ItemGrid.define(component2d({\n key: \"rectangularGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Re-flow the items into `columns` columns, each moving to its new cell. */\n columnsTo: {\n args: { columns: ItemGrid.hinted(4, { min: 1, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => {\n const columns = Math.max(1, Math.round(timeline.args.columns ?? s.columns))\n return ItemGrid.transitionTo(timeline as never, s, children, { columns })\n },\n },\n /** Animate the spacing between columns and rows. */\n gapTo: {\n args: { columnGap: ItemGrid.hinted(48), rowGap: ItemGrid.hinted(48) },\n run: (timeline) => {\n const data: { columnGap?: number; rowGap?: number } = {}\n if (timeline.args.columnGap !== undefined) data.columnGap = timeline.args.columnGap\n if (timeline.args.rowGap !== undefined) data.rowGap = timeline.args.rowGap\n return timeline.tween(data)\n },\n },\n /**\n * Animate the cell size, from whatever the cells measure now. The grid\n * switches to `fixed` cells as it starts, since a size of its own is what\n * `fixed` means.\n */\n cellSizeTo: {\n args: { cellWidth: ItemGrid.hinted(160, { min: 0 }), cellHeight: ItemGrid.hinted(160, { min: 0 }) },\n easing: easeInOut(\"cubic\"),\n run: (timeline, s, children) => {\n const sizes = children.map((child) => child.size)\n const box = ItemGrid.contentBox(timeline.node.size, s.padding)\n const from = rectangularCell(arrangement(s), sizes.length, sizes, box)\n const width = timeline.args.cellWidth ?? from.width\n const height = timeline.args.cellHeight ?? from.height\n return timeline.animate((t) => ({\n cellMode: \"fixed\",\n cellWidth: from.width + (width - from.width) * t,\n cellHeight: from.height + (height - from.height) * t,\n }))\n },\n },\n /** Bring one row (from 0 at the top) forward and push the rest back. */\n focusRow: {\n args: { row: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const row = Math.round(timeline.args.row ?? 0)\n const inRow = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.row === row\n return ItemGrid.focusOn(timeline as never, s, inRow, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n /** Bring one column (from 0 at the left) forward and push the rest back. */\n focusColumn: {\n args: { column: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const column = Math.round(timeline.args.column ?? 0)\n const inColumn = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.column === column\n return ItemGrid.focusOn(timeline as never, s, inColumn, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RectangularGrid = NodeOf<typeof RectangularGrid>\n/** What a call or a document row may set. */\nexport type RectangularGridProps = NonNullable<Parameters<typeof RectangularGrid>[0]>\n"]}
|
|
1
|
+
{"version":3,"file":"rectangular-grid.js","sourceRoot":"","sources":["../../src/rectangular-grid/rectangular-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n easeInOut,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n CELL_MODES,\n FILL_DIRECTIONS,\n ItemGrid,\n LINE_ALIGNS,\n rectangularCell,\n staggerArgs,\n TRANSITION_STAGGER,\n type RectangularArrangement,\n} from \"../kit\"\n\nconst own = {\n columns: Types.number(3, { min: 1, step: 1 }),\n fillDirection: Types.oneOf(FILL_DIRECTIONS, { default: \"row\" }),\n cellMode: Types.oneOf(CELL_MODES, { default: \"fit\" }),\n cellWidth: Types.number(120, { min: 0, step: 1 }),\n cellHeight: Types.number(120, { min: 0, step: 1 }),\n columnGap: Types.number(24, { step: 1 }),\n rowGap: Types.number(24, { step: 1 }),\n lastLineAlign: Types.oneOf(LINE_ALIGNS, { default: \"start\" }),\n rowOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n columnOffset: Types.number(0, { min: -1, max: 1, step: 0.05 }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): RectangularArrangement {\n return {\n kind: \"rectangular\",\n columns: s.columns,\n fillDirection: s.fillDirection,\n cellMode: s.cellMode,\n cellWidth: s.cellWidth,\n cellHeight: s.cellHeight,\n columnGap: s.columnGap,\n rowGap: s.rowGap,\n lastLineAlign: s.lastLineAlign,\n rowOffset: s.rowOffset,\n columnOffset: s.columnOffset,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = {\n arrangement,\n // A child set to fill takes its cell, where the cell is not simply the largest child.\n itemSpace: (s, count, space) => (s.cellMode === \"fit\" ? space : rectangularCell(arrangement(s), count, [], space)),\n}\n\n/** The focus args of a row or a column: the grow a row leaves out is the shared focus's. */\nconst lineFocus = {\n dim: Types.number(0.7, { min: 0, max: 1, step: 0.05 }),\n grow: ItemGrid.hinted(0.1, { min: 0, max: 1, step: 0.05 }),\n}\n\n/**\n * Children in rows and columns — the grid the other three are variations on.\n *\n * Cells are as big as the largest child (`fit`), a size of their own\n * (`fixed`), or an equal share of the node's box (`fill`), which is also the\n * room a child set to fill grows into. Shift every other row by half a cell\n * for a brick bond or a hex pack.\n */\nexport const RectangularGrid = ItemGrid.define(component2d({\n key: \"rectangularGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Re-flow the items into `columns` columns, each moving to its new cell. */\n columnsTo: {\n args: { columns: ItemGrid.hinted(4, { min: 1, step: 1 }), ...staggerArgs(TRANSITION_STAGGER) },\n run: (timeline, s, children) => {\n const columns = Math.max(1, Math.round(timeline.args.columns ?? s.columns))\n return ItemGrid.transitionTo(timeline as never, s, children, { columns })\n },\n },\n /** Animate the spacing between columns and rows. */\n gapTo: {\n args: { columnGap: ItemGrid.hinted(48), rowGap: ItemGrid.hinted(48) },\n run: (timeline) => {\n const data: { columnGap?: number; rowGap?: number } = {}\n if (timeline.args.columnGap !== undefined) data.columnGap = timeline.args.columnGap\n if (timeline.args.rowGap !== undefined) data.rowGap = timeline.args.rowGap\n return timeline.tween(data)\n },\n },\n /**\n * Animate the cell size, from whatever the cells measure now. The grid\n * switches to `fixed` cells as it starts, since a size of its own is what\n * `fixed` means.\n */\n cellSizeTo: {\n args: { cellWidth: ItemGrid.hinted(160, { min: 0 }), cellHeight: ItemGrid.hinted(160, { min: 0 }) },\n easing: easeInOut(\"cubic\"),\n run: (timeline, s, children) => {\n const sizes = children.map((child) => child.size)\n const box = ItemGrid.contentBox(timeline.node.size, s.padding)\n const from = rectangularCell(arrangement(s), sizes.length, sizes, box)\n const width = timeline.args.cellWidth ?? from.width\n const height = timeline.args.cellHeight ?? from.height\n return timeline.animate((t) => ({\n cellMode: \"fixed\",\n cellWidth: from.width + (width - from.width) * t,\n cellHeight: from.height + (height - from.height) * t,\n }))\n },\n },\n /** Bring one row (from 0 at the top) forward and push the rest back. */\n focusRow: {\n args: { row: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const row = Math.round(timeline.args.row ?? 0)\n const inRow = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.row === row\n return ItemGrid.focusOn(timeline as never, s, inRow, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n /** Bring one column (from 0 at the left) forward and push the rest back. */\n focusColumn: {\n args: { column: Types.number(0, { min: 0, step: 1 }), ...lineFocus },\n run: (timeline, s, children) => {\n const slots = ItemGrid.itemSlots(timeline as never, s, children)\n const column = Math.round(timeline.args.column ?? 0)\n const inColumn = (i: number) => slots[i]?.meta.kind === \"rectangular\" && slots[i].meta.column === column\n return ItemGrid.focusOn(timeline as never, s, inColumn, slots.length, timeline.args.dim ?? 0.7, timeline.args.grow ?? 0.15)\n },\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type RectangularGrid = NodeOf<typeof RectangularGrid>\n"]}
|
|
@@ -195,6 +195,4 @@ export declare const SphereGrid: import("@motionscript/sdk").Component<"sphereGr
|
|
|
195
195
|
};
|
|
196
196
|
}, _Node2D<_Node2DProps>>>>;
|
|
197
197
|
export type SphereGrid = NodeOf<typeof SphereGrid>;
|
|
198
|
-
/** What a call or a document row may set. */
|
|
199
|
-
export type SphereGridProps = NonNullable<Parameters<typeof SphereGrid>[0]>;
|
|
200
198
|
//# sourceMappingURL=sphere-grid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sphere-grid.d.ts","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,QAAQ,EAQT,MAAM,QAAQ,CAAA;AAmCf;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA6DV,CAAA;AAEb,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"sphere-grid.d.ts","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAGX,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EACjC,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,QAAQ,EAQT,MAAM,QAAQ,CAAA;AAmCf;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA6DV,CAAA;AAEb,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sphere-grid.js","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n normalizeOrder,\n SPHERE_AXES,\n SPHERE_FACINGS,\n sphereFaceForward,\n wrapDegrees,\n type SphereArrangement,\n type SphereAxis,\n} from \"../kit\"\n\nconst own = {\n radius: Types.number(220, { min: 0, step: 1 }),\n yaw: Types.number(0, { step: 1, unit: \"°\" }),\n pitch: Types.number(0, { step: 1, unit: \"°\" }),\n roll: Types.number(0, { step: 1, unit: \"°\" }),\n facing: Types.oneOf(SPHERE_FACINGS, { default: \"outward\" }),\n focalLength: Types.number(900, { min: 100, step: 10 }),\n depthFade: Types.number(0.5, { min: 0, max: 1, step: 0.05 }),\n cullBackfaces: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): SphereArrangement {\n return {\n kind: \"sphere\",\n radius: s.radius,\n yaw: s.yaw,\n pitch: s.pitch,\n roll: s.roll,\n facing: s.facing,\n focalLength: s.focalLength,\n depthFade: s.depthFade,\n cullBackfaces: s.cullBackfaces,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\nconst AXIS_PROP: Record<SphereAxis, \"yaw\" | \"pitch\" | \"roll\"> = { x: \"pitch\", y: \"yaw\", z: \"roll\" }\n\n/**\n * Children spread over a sphere — a Fibonacci lattice, as even as any number\n * of points gets — and seen through a camera of the grid's own, so the far\n * side is smaller, drawn first, and hidden where a face turns away.\n *\n * `outward` lays each item flat on the surface; `billboard` keeps each one\n * facing the viewer, like labels on a globe. `turnTo` brings any item round\n * to the front.\n */\nexport const SphereGrid = ItemGrid.define(component2d({\n key: \"sphereGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Turn the sphere about an axis by `degrees` — `y` spins it like a globe. */\n spin: {\n args: {\n axis: Types.oneOf(SPHERE_AXES, { default: \"y\" }),\n degrees: Types.number(360, { step: 15, unit: \"°\" }),\n },\n run: (timeline, s) => {\n const key = AXIS_PROP[timeline.args.axis ?? \"y\"] ?? \"yaw\"\n return timeline.tween({ [key]: s[key] + (timeline.args.degrees ?? 360) })\n },\n },\n /** Turn the sphere to a set orientation. */\n orientTo: {\n args: {\n yaw: ItemGrid.hinted(45, { unit: \"°\" }),\n pitch: ItemGrid.hinted(20, { unit: \"°\" }),\n roll: ItemGrid.hinted(0, { unit: \"°\" }),\n },\n run: (timeline, s) => timeline.tween({\n yaw: timeline.args.yaw ?? s.yaw,\n pitch: timeline.args.pitch ?? s.pitch,\n roll: timeline.args.roll ?? s.roll,\n }),\n },\n /**\n * Turn the sphere the shorter way until an item (by its place in the layers)\n * faces the viewer. It turns from the orientation the sphere is given: the\n * yaw its `spinSpeed` adds by the time the command runs is not counted, as\n * commands are built against the tree standing at time 0.\n */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n if (slot < 0) return timeline.tween({})\n const facing = sphereFaceForward(count, slot)\n return timeline.tween({\n yaw: s.yaw + wrapDegrees(facing.yaw - s.yaw),\n pitch: s.pitch + wrapDegrees(facing.pitch - s.pitch),\n roll: 0,\n })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(300, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Dolly the camera: a shorter focal length exaggerates the depth, a longer one flattens it. */\n focalLengthTo: {\n args: { focalLength: ItemGrid.hinted(600, { min: 100 }) },\n run: (timeline, s) => timeline.tween({ focalLength: timeline.args.focalLength ?? s.focalLength }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type SphereGrid = NodeOf<typeof SphereGrid>\n
|
|
1
|
+
{"version":3,"file":"sphere-grid.js","sourceRoot":"","sources":["../../src/sphere-grid/sphere-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n component2d,\n Types,\n type NodeOf,\n type Values,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\"\n\nimport {\n ItemGrid,\n normalizeOrder,\n SPHERE_AXES,\n SPHERE_FACINGS,\n sphereFaceForward,\n wrapDegrees,\n type SphereArrangement,\n type SphereAxis,\n} from \"../kit\"\n\nconst own = {\n radius: Types.number(220, { min: 0, step: 1 }),\n yaw: Types.number(0, { step: 1, unit: \"°\" }),\n pitch: Types.number(0, { step: 1, unit: \"°\" }),\n roll: Types.number(0, { step: 1, unit: \"°\" }),\n facing: Types.oneOf(SPHERE_FACINGS, { default: \"outward\" }),\n focalLength: Types.number(900, { min: 100, step: 10 }),\n depthFade: Types.number(0.5, { min: 0, max: 1, step: 0.05 }),\n cullBackfaces: false,\n spinSpeed: Types.number(0, { step: 1, unit: \"°/s\" }),\n}\n\ntype Own = Values<typeof own>\n\nfunction arrangement(s: Own): SphereArrangement {\n return {\n kind: \"sphere\",\n radius: s.radius,\n yaw: s.yaw,\n pitch: s.pitch,\n roll: s.roll,\n facing: s.facing,\n focalLength: s.focalLength,\n depthFade: s.depthFade,\n cullBackfaces: s.cullBackfaces,\n spinSpeed: s.spinSpeed,\n }\n}\n\nconst arranger: ItemGrid.Arranger<Own> = { arrangement }\n\nconst AXIS_PROP: Record<SphereAxis, \"yaw\" | \"pitch\" | \"roll\"> = { x: \"pitch\", y: \"yaw\", z: \"roll\" }\n\n/**\n * Children spread over a sphere — a Fibonacci lattice, as even as any number\n * of points gets — and seen through a camera of the grid's own, so the far\n * side is smaller, drawn first, and hidden where a face turns away.\n *\n * `outward` lays each item flat on the surface; `billboard` keeps each one\n * facing the viewer, like labels on a globe. `turnTo` brings any item round\n * to the front.\n */\nexport const SphereGrid = ItemGrid.define(component2d({\n key: \"sphereGrid\",\n state: { ...ItemGrid.state, ...own },\n defaults: ItemGrid.defaults,\n commands: {\n ...ItemGrid.commands,\n /** Turn the sphere about an axis by `degrees` — `y` spins it like a globe. */\n spin: {\n args: {\n axis: Types.oneOf(SPHERE_AXES, { default: \"y\" }),\n degrees: Types.number(360, { step: 15, unit: \"°\" }),\n },\n run: (timeline, s) => {\n const key = AXIS_PROP[timeline.args.axis ?? \"y\"] ?? \"yaw\"\n return timeline.tween({ [key]: s[key] + (timeline.args.degrees ?? 360) })\n },\n },\n /** Turn the sphere to a set orientation. */\n orientTo: {\n args: {\n yaw: ItemGrid.hinted(45, { unit: \"°\" }),\n pitch: ItemGrid.hinted(20, { unit: \"°\" }),\n roll: ItemGrid.hinted(0, { unit: \"°\" }),\n },\n run: (timeline, s) => timeline.tween({\n yaw: timeline.args.yaw ?? s.yaw,\n pitch: timeline.args.pitch ?? s.pitch,\n roll: timeline.args.roll ?? s.roll,\n }),\n },\n /**\n * Turn the sphere the shorter way until an item (by its place in the layers)\n * faces the viewer. It turns from the orientation the sphere is given: the\n * yaw its `spinSpeed` adds by the time the command runs is not counted, as\n * commands are built against the tree standing at time 0.\n */\n turnTo: {\n args: { item: Types.number(0, { min: 0, step: 1 }) },\n run: (timeline, s, children) => {\n const count = children.length\n const slot = normalizeOrder(s.order, count).indexOf(Math.round(timeline.args.item ?? 0))\n if (slot < 0) return timeline.tween({})\n const facing = sphereFaceForward(count, slot)\n return timeline.tween({\n yaw: s.yaw + wrapDegrees(facing.yaw - s.yaw),\n pitch: s.pitch + wrapDegrees(facing.pitch - s.pitch),\n roll: 0,\n })\n },\n },\n radiusTo: {\n args: { radius: ItemGrid.hinted(300, { min: 0 }) },\n run: (timeline, s) => timeline.tween({ radius: timeline.args.radius ?? s.radius }),\n },\n /** Dolly the camera: a shorter focal length exaggerates the depth, a longer one flattens it. */\n focalLengthTo: {\n args: { focalLength: ItemGrid.hinted(600, { min: 100 }) },\n run: (timeline, s) => timeline.tween({ focalLength: timeline.args.focalLength ?? s.focalLength }),\n },\n },\n ...ItemGrid.fields(arranger),\n}), arranger)\n\nexport type SphereGrid = NodeOf<typeof SphereGrid>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@motionscript/grids",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1-alpha.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Grid layouts for Motion Script: rectangular, radial, path and spherical arrangements of a node's children, with staggered reveals, waves, focus and morphs between them.",
|
|
6
6
|
"repository": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"license": "Apache-2.0",
|
|
51
51
|
"author": "Motionscript",
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@motionscript/sdk": "^0.1.
|
|
53
|
+
"@motionscript/sdk": "^0.1.1-alpha.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^25.6.2",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"typescript": "^6.0.3",
|
|
62
62
|
"typescript-eslint": "^8.48.0",
|
|
63
63
|
"vitest": "^4.1.5",
|
|
64
|
-
"@motionscript/core": "0.1.
|
|
65
|
-
"@motionscript/sdk": "0.1.
|
|
64
|
+
"@motionscript/core": "0.1.1-alpha.1",
|
|
65
|
+
"@motionscript/sdk": "0.1.1-alpha.1"
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
68
|
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json --resolve-full-paths && node ../../../scripts/build-browser.mjs",
|
package/src/engine.ts
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
* A copy takes a grid's own files into your project and rewrites its reach for
|
|
6
|
-
* these to `@motionscript/grids`, so the shared parts stay a real
|
|
7
|
-
* dependency. That is not a size decision. `ItemGrid` keeps the register of
|
|
8
|
-
* grids a morph looks another grid's arrangement up in, so a second copy of it
|
|
9
|
-
* would be a second register, and a morph from one grid to another would only
|
|
10
|
-
* find the grids its own copy was told of.
|
|
11
|
-
*/
|
|
1
|
+
// What the four grids share. A copied grid imports it from `@motionscript/grids` because `ItemGrid`
|
|
2
|
+
// keeps the register a morph looks another grid up in: a second copy would be a second register,
|
|
3
|
+
// and a morph would find only the grids its own copy knew.
|
|
12
4
|
export * from "./kit"
|
package/src/kit/index.ts
CHANGED
package/src/kit/item-effects.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { clamp, type Size2D } from "@motionscript/sdk"
|
|
2
2
|
|
|
3
3
|
import type { Slot } from "./slots"
|
|
4
4
|
|
|
@@ -13,10 +13,7 @@ export type RevealStyle = (typeof REVEAL_STYLES)[number]
|
|
|
13
13
|
export const WAVE_STYLES = ["scale", "lift", "fade", "spin"] as const
|
|
14
14
|
export type WaveStyle = (typeof WAVE_STYLES)[number]
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
* How far into view each item is, `1` shown and `0` gone — past `1` on the
|
|
18
|
-
* way to it under an overshooting ease. Absent means every item is shown.
|
|
19
|
-
*/
|
|
16
|
+
/** `1` shown and `0` gone, past `1` under an overshooting ease; absent means every item is shown. */
|
|
20
17
|
export interface RevealState {
|
|
21
18
|
style: RevealStyle
|
|
22
19
|
values: readonly number[]
|
|
@@ -55,7 +52,7 @@ export function applyItemEffects(
|
|
|
55
52
|
|
|
56
53
|
function applyReveal(s: Slot, style: RevealStyle, v: number, size: Size2D): void {
|
|
57
54
|
if (v === 1) return
|
|
58
|
-
const shown =
|
|
55
|
+
const shown = clamp(v, 0, 1)
|
|
59
56
|
switch (style) {
|
|
60
57
|
case "fade":
|
|
61
58
|
s.opacity *= shown
|
|
@@ -64,7 +61,7 @@ function applyReveal(s: Slot, style: RevealStyle, v: number, size: Size2D): void
|
|
|
64
61
|
s.x *= v
|
|
65
62
|
s.y *= v
|
|
66
63
|
s.depth *= v
|
|
67
|
-
s.opacity *=
|
|
64
|
+
s.opacity *= clamp(v * 4, 0, 1)
|
|
68
65
|
break
|
|
69
66
|
case "rise":
|
|
70
67
|
s.y -= (1 - v) * Math.max(40, size.height)
|
|
@@ -89,7 +86,7 @@ function applyWave(s: Slot, wave: WaveState, w: number, size: Size2D): void {
|
|
|
89
86
|
s.y += wave.amount * w * Math.max(40, size.height)
|
|
90
87
|
break
|
|
91
88
|
case "fade":
|
|
92
|
-
s.opacity *=
|
|
89
|
+
s.opacity *= clamp(1 - wave.amount * w, 0, 1)
|
|
93
90
|
break
|
|
94
91
|
case "spin":
|
|
95
92
|
s.rotation += wave.amount * w * 360
|
|
@@ -105,10 +102,6 @@ function applyFocus(s: Slot, focus: FocusState, f: number): void {
|
|
|
105
102
|
s.scale *= 1 + focus.grow * f
|
|
106
103
|
return
|
|
107
104
|
}
|
|
108
|
-
s.opacity *=
|
|
105
|
+
s.opacity *= clamp(1 - focus.dim * -f, 0, 1)
|
|
109
106
|
s.scale *= Math.max(0, 1 + focus.grow * 0.5 * f)
|
|
110
107
|
}
|
|
111
|
-
|
|
112
|
-
function clamp01(v: number): number {
|
|
113
|
-
return v < 0 ? 0 : v > 1 ? 1 : v
|
|
114
|
-
}
|
package/src/kit/item-grid.ts
CHANGED
|
@@ -36,39 +36,17 @@ import { hashSeed, shuffled } from "./random"
|
|
|
36
36
|
import { blendSlot, focalLengthOf, slotsOf, spreadSlot, type Arrangement, type Slot } from "./slots"
|
|
37
37
|
import { STAGGER_ORDERS, staggerProgress, staggerRanks, type StaggerOrder } from "./stagger"
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
* them — still work, relative to the slot. A group is one item; a grid of
|
|
51
|
-
* grids is a grid of items that happen to be grids.
|
|
52
|
-
*
|
|
53
|
-
* ## One pass
|
|
54
|
-
*
|
|
55
|
-
* Every frame: measure the children, ask the arrangement for its slots (a pure
|
|
56
|
-
* function of the state, the sizes and the clock), blend them from where a
|
|
57
|
-
* transition is leaving, and layer on the per-item effects — reveal, wave,
|
|
58
|
-
* focus. What is left is each child's box and slot, which the renderer,
|
|
59
|
-
* picking and `global` all read, so a selection outline lands on the pixels
|
|
60
|
-
* even on a sphere.
|
|
61
|
-
*
|
|
62
|
-
* ## Commands
|
|
63
|
-
*
|
|
64
|
-
* Every command is a pure function of time. The per-item ones stagger *inside*
|
|
65
|
-
* their duration — a one-second reveal takes one second for four children or
|
|
66
|
-
* four hundred — and write their per-item state into entries
|
|
67
|
-
* (`revealState` and its siblings), which is what keeps them seekable. The ones
|
|
68
|
-
* that change the arrangement itself (a reorder, a morph, a column count) keep
|
|
69
|
-
* the arrangement they are leaving as data and blend each item from its old
|
|
70
|
-
* slot to its new one.
|
|
71
|
-
*/
|
|
39
|
+
// What every grid is built from: spread `state`, `commands` and `defaults` in, give `fields` the
|
|
40
|
+
// {@link Arranger} that makes the arrangement from the state, and pass the component and its
|
|
41
|
+
// arranger through {@link define}.
|
|
42
|
+
// The items are the children in layer order; a slot is a parent transform on a child, so its own
|
|
43
|
+
// x/y/rotation/scale and their commands still work relative to it.
|
|
44
|
+
// Every frame measures the children, asks the arrangement for slots (pure in state, sizes and
|
|
45
|
+
// clock), blends from the arrangement a transition leaves, and layers the per-item effects; the
|
|
46
|
+
// result is each child's box and slot, which rendering, picking and `global` all read.
|
|
47
|
+
// Every command is a pure function of time. Per-item ones stagger inside their duration and write
|
|
48
|
+
// their state to entries, which keeps them seekable; ones that change the arrangement keep the one
|
|
49
|
+
// they leave as data and blend each item from its old slot to its new.
|
|
72
50
|
|
|
73
51
|
/** An arrangement a grid is leaving, kept as data so its slots can be worked out afresh every frame. */
|
|
74
52
|
export interface GridSnapshot {
|
|
@@ -235,11 +213,7 @@ export function layout<S>(box: LayoutBox, s: GridState & S, children: readonly C
|
|
|
235
213
|
return slots.map((slot, i) => placement(inner, slot, sizes[i]))
|
|
236
214
|
}
|
|
237
215
|
|
|
238
|
-
/**
|
|
239
|
-
* A grid whose arrangement has depth is seen through a camera of its own,
|
|
240
|
-
* which paints its items far to near — unless it already sits in a space (an
|
|
241
|
-
* orbit camera, a 3D stage), where its items join that one and its camera.
|
|
242
|
-
*/
|
|
216
|
+
/** A grid with depth is seen through a camera of its own, painting far to near, unless it already sits in a space, whose camera its items join. */
|
|
243
217
|
export function render<S>(ctx: RenderContext, s: GridState & S, arranger: Arranger<S>): void {
|
|
244
218
|
// With no items there is nothing to see through a camera.
|
|
245
219
|
const focal = s.children.length === 0 ? 0 : focalOf(s, arrangementOf({ state: s, arranger, children: [], isSelf: () => false }, contentBox(ctx.size, s.padding)))
|
|
@@ -247,21 +221,15 @@ export function render<S>(ctx: RenderContext, s: GridState & S, arranger: Arrang
|
|
|
247
221
|
else ctx.children()
|
|
248
222
|
}
|
|
249
223
|
|
|
250
|
-
/**
|
|
224
|
+
/** Its laid-out size inside its padding. */
|
|
251
225
|
export function contentBoxOf(grid: Node2D): Size2D {
|
|
252
226
|
const b = grid.layoutBounds
|
|
253
227
|
return contentBox({ width: b.width, height: b.height }, grid.effectivePadding())
|
|
254
228
|
}
|
|
255
229
|
|
|
256
|
-
// ---- what commands share --------------------------------------------------
|
|
257
|
-
|
|
258
230
|
type GridTimeline = Timeline<StaggerArgs, never>
|
|
259
231
|
|
|
260
|
-
/**
|
|
261
|
-
* Each item's slot in its arrangement as it stands, for a command being built,
|
|
262
|
-
* at the clock commands are built against (the tree stands at time 0 while a
|
|
263
|
-
* timeline compiles): what its stagger is ranked by.
|
|
264
|
-
*/
|
|
232
|
+
/** Each item's slot as the arrangement stands while a command is built (the tree stands at time 0 then): what its stagger is ranked by. */
|
|
265
233
|
export function itemSlots(timeline: Timeline<object, never>, s: GridValues, children: readonly ChildView[]): Slot[] {
|
|
266
234
|
const grid = commandGrid(timeline, s, children)
|
|
267
235
|
const sizes = children.map((child) => child.size)
|
|
@@ -273,10 +241,7 @@ export function ranks(timeline: Timeline<object, never>, s: GridValues, children
|
|
|
273
241
|
return staggerRanks(order ?? "index", itemSlots(timeline, s, children), hashSeed(timeline.node.id))
|
|
274
242
|
}
|
|
275
243
|
|
|
276
|
-
/**
|
|
277
|
-
* Write `changes` to the arrangement and move each item from its slot in the
|
|
278
|
-
* one being left to its slot in the new one, staggered.
|
|
279
|
-
*/
|
|
244
|
+
/** Writes `changes` to the arrangement and moves each item, staggered, from its slot in the one being left to its slot in the new one. */
|
|
280
245
|
export function transitionTo(
|
|
281
246
|
timeline: GridTimeline,
|
|
282
247
|
s: GridValues,
|
|
@@ -448,8 +413,6 @@ export const commands = commandsFor(GRID_STATE, {
|
|
|
448
413
|
},
|
|
449
414
|
})
|
|
450
415
|
|
|
451
|
-
// ---- the one pass ------------------------------------------------------------
|
|
452
|
-
|
|
453
416
|
interface Grid {
|
|
454
417
|
readonly state: GridValues
|
|
455
418
|
readonly arranger: Arranger<never>
|
package/src/kit/order.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* leaves a slot empty or two items in one.
|
|
2
|
+
* `order` lists items in slot order (slot `k` holds item `order[k]`), repaired into a
|
|
3
|
+
* permutation of `0..count-1` — valid entries first, then the rest — so a stale entry, a
|
|
4
|
+
* repeat or a child added or removed never leaves a slot empty or doubled.
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
/** `order` repaired into a permutation of `0..count-1`: its valid entries first, then the rest in item order. */
|
|
9
6
|
export function normalizeOrder(order: readonly number[] | undefined, count: number): number[] {
|
|
10
7
|
const out: number[] = []
|
|
11
8
|
const taken = new Array<boolean>(count).fill(false)
|
package/src/kit/random.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** A seeded generator in `[0, 1)` — mulberry32, so a shuffle is the same on every frame and every machine. */
|
|
2
|
-
|
|
2
|
+
function seededRandom(seed: number): () => number {
|
|
3
3
|
let a = Math.floor(seed) >>> 0
|
|
4
4
|
return () => {
|
|
5
5
|
a = (a + 0x6d2b79f5) >>> 0
|
package/src/kit/slots/index.ts
CHANGED
|
@@ -17,8 +17,6 @@ export * from "./sphere"
|
|
|
17
17
|
*/
|
|
18
18
|
export type Arrangement = RectangularArrangement | RadialArrangement | PathArrangement | SphereArrangement
|
|
19
19
|
|
|
20
|
-
export type ArrangementKind = Arrangement["kind"]
|
|
21
|
-
|
|
22
20
|
/** Where each of `input.count` items sits under `arrangement`, in slot order. */
|
|
23
21
|
export function slotsOf(arrangement: Arrangement, input: SlotInput): Slot[] {
|
|
24
22
|
switch (arrangement.kind) {
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import type { PathCommand, Size2D } from "@motionscript/sdk"
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* The shapes a path grid can follow without a path of its own, each drawn to
|
|
5
|
-
* fill the grid's box. Centred and y-up, like every path in the library; the
|
|
6
|
-
* closed ones run clockwise, so an item flowing along any of them travels the
|
|
7
|
-
* same way round.
|
|
8
|
-
*/
|
|
3
|
+
/** Shapes drawn to fill the grid's box, centred and y-up; the closed ones run clockwise so flow goes the same way round. */
|
|
9
4
|
export const PATH_TEMPLATES = [
|
|
10
5
|
"circle",
|
|
11
6
|
"square",
|
package/src/kit/slots/path.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { pathOps, type PathData, type PathSampler } from "@motionscript/sdk"
|
|
1
|
+
import { clamp, pathOps, type PathData, type PathSampler } from "@motionscript/sdk"
|
|
2
2
|
|
|
3
3
|
import { slot, type Slot, type SlotInput } from "./slot"
|
|
4
4
|
|
|
@@ -68,8 +68,8 @@ export function pathSlots(arrangement: PathArrangement, input: SlotInput): Slot[
|
|
|
68
68
|
if (count === 0) return []
|
|
69
69
|
const { sampler, closed } = measured(arrangement.path)
|
|
70
70
|
const length = sampler.length
|
|
71
|
-
const a =
|
|
72
|
-
const b =
|
|
71
|
+
const a = clamp(Math.min(arrangement.trimStart, arrangement.trimEnd), 0, 1)
|
|
72
|
+
const b = clamp(Math.max(arrangement.trimStart, arrangement.trimEnd), 0, 1)
|
|
73
73
|
const start = a * length
|
|
74
74
|
const span = (b - a) * length
|
|
75
75
|
const loops = closed && a === 0 && b === 1
|
|
@@ -92,9 +92,9 @@ export function pathSlots(arrangement: PathArrangement, input: SlotInput): Slot[
|
|
|
92
92
|
let visible = true
|
|
93
93
|
if (loops) u = u - Math.floor(u)
|
|
94
94
|
else if (u < -1e-9 || u > 1 + 1e-9) visible = false
|
|
95
|
-
const at = sampler.frameAt(start +
|
|
95
|
+
const at = sampler.frameAt(start + clamp(u, 0, 1) * span)
|
|
96
96
|
if (!at) {
|
|
97
|
-
const s = slot(0, 0, { kind: "path", t:
|
|
97
|
+
const s = slot(0, 0, { kind: "path", t: clamp(u, 0, 1) })
|
|
98
98
|
s.opacity = 0
|
|
99
99
|
slots.push(s)
|
|
100
100
|
continue
|
|
@@ -106,7 +106,7 @@ export function pathSlots(arrangement: PathArrangement, input: SlotInput): Slot[
|
|
|
106
106
|
const s = slot(
|
|
107
107
|
place.x + px * cos + py * sin,
|
|
108
108
|
place.y - px * sin + py * cos,
|
|
109
|
-
{ kind: "path", t:
|
|
109
|
+
{ kind: "path", t: clamp(u, 0, 1) },
|
|
110
110
|
)
|
|
111
111
|
if (arrangement.alignToPath) s.rotation = (-Math.atan2(at.ty * flip, at.tx) * 180) / Math.PI + place.rotation
|
|
112
112
|
if (!visible) s.opacity = 0
|
|
@@ -114,7 +114,3 @@ export function pathSlots(arrangement: PathArrangement, input: SlotInput): Slot[
|
|
|
114
114
|
}
|
|
115
115
|
return slots
|
|
116
116
|
}
|
|
117
|
-
|
|
118
|
-
function clamp01(v: number): number {
|
|
119
|
-
return v < 0 ? 0 : v > 1 ? 1 : v
|
|
120
|
-
}
|